সহজেই কোনও নামডটপলে ডকুমেন্টেশন স্ট্রিং যুক্ত করা সম্ভব?
হ্যাঁ, বিভিন্ন উপায়ে
সাবক্লাস টাইপিং.নামডটুপল - পাইথন ৩.+++
পাইথন ৩.6 হিসাবে আমরা সরাসরি একটি ডকস্ট্রিং (এবং টীকাগুলি) class
দিয়ে একটি সংজ্ঞা ব্যবহার করতে পারি typing.NamedTuple
:
from typing import NamedTuple
class Card(NamedTuple):
"""This is a card type."""
suit: str
rank: str
পাইথন 2 এর সাথে তুলনা করে, খালি ঘোষণা করা __slots__
প্রয়োজন হয় না। পাইথন ৩.৮-তে, এটি সাবক্লাসগুলির জন্যও প্রয়োজনীয় নয়।
নোট করুন যে ঘোষণাটি __slots__
অ-খালি হতে পারে না!
পাইথন 3-এ, আপনি সহজেই কোনও নেমটুপলে ডকটি পরিবর্তন করতে পারেন:
NT = collections.namedtuple('NT', 'foo bar')
NT.__doc__ = """:param str foo: foo name
:param list bar: List of bars to bar"""
আমরা যখন তাদের কাছে সাহায্যের জন্য কল করি তখন এটি তাদের জন্য লক্ষ্যটি দেখতে দেয়:
Help on class NT in module __main__:
class NT(builtins.tuple)
| :param str foo: foo name
| :param list bar: List of bars to bar
...
পাইথন 2 এ আমরা একই জিনিসটি অর্জন করতে যে সমস্যাগুলি করেছি তার তুলনায় এটি সত্যই সহজ।
পাইথন 2
পাইথন 2 এ আপনার দরকার
- নামফলক সাবক্লাস, এবং
- ঘোষণা
__slots__ == ()
ঘোষনা __slots__
করা একটি গুরুত্বপূর্ণ অংশ যা অন্য উত্তরগুলি এখানে মিস করে ।
আপনি যদি ঘোষণা না করেন __slots__
- আপনি বাগগুলি প্রবর্তন করে দৃষ্টান্তগুলিতে পরিবর্তনীয় অ্যাড-হক বৈশিষ্ট্য যুক্ত করতে পারেন।
class Foo(namedtuple('Foo', 'bar')):
"""no __slots__ = ()!!!"""
এবং এখন:
>>> f = Foo('bar')
>>> f.bar
'bar'
>>> f.baz = 'what?'
>>> f.__dict__
{'baz': 'what?'}
অ্যাক্সেস করা হয়ে __dict__
গেলে প্রতিটি উদাহরণ পৃথক তৈরি করবে __dict__
(অভাব __slots__
অন্যথায় কার্যকারিতা বাধাগ্রস্ত করবে না, তবে টিউপল, লঘুতা এবং ঘোষিত বৈশিষ্ট্যের হালকাতা সব নামকরণকারীর গুরুত্বপূর্ণ বৈশিষ্ট্য)।
আপনি __repr__
যদি একটি কমান্ড লাইনে প্রতিধ্বনিত হয় যা আপনাকে একটি সমতুল্য বস্তু দিতে চান তাও আপনি চাইবেন:
NTBase = collections.namedtuple('NTBase', 'foo bar')
class NT(NTBase):
"""
Individual foo bar, a namedtuple
:param str foo: foo name
:param list bar: List of bars to bar
"""
__slots__ = ()
__repr__
আপনি যদি আলাদা নামের সাথে বেসটি নেমটিপল বেস তৈরি করেন তবে এর মতো একটি প্রয়োজন (যেমন আমরা উপরে নামের স্ট্রিং যুক্তির সাহায্যে করেছি 'NTBase'
):
def __repr__(self):
return 'NT(foo={0}, bar={1})'.format(
repr(self.foo), repr(self.bar))
পুনরায় পরীক্ষা করতে, তাত্ক্ষণিকভাবে পরীক্ষা করে তারপরে পাসের সমতার জন্য পরীক্ষা করে eval(repr(instance))
nt = NT('foo', 'bar')
assert eval(repr(nt)) == nt
ডকুমেন্টেশন থেকে উদাহরণ
ডক্স এছাড়াও যেমন একটি উদাহরণ সংক্রান্ত দিতে, __slots__
- আমি এটা আমার নিজের docstring যোগ করছি:
class Point(namedtuple('Point', 'x y')):
"""Docstring added here, not in original"""
__slots__ = ()
@property
def hypot(self):
return (self.x ** 2 + self.y ** 2) ** 0.5
def __str__(self):
return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot)
...
উপরের দেখানো সাবক্লাসটি __slots__
একটি খালি টিপল সেট করে। এটি উদাহরণস্বরূপ অভিধানগুলি রোধ করে মেমরির প্রয়োজনীয়তাগুলি কম রাখতে সহায়তা করে।
এটি স্থান-ব্যবহারের ব্যবহারটি প্রমাণ করে (অন্য উত্তরটির মতো এখানে প্রস্তাবিত হয়), তবে নোট করুন যে আপনি যখন পদ্ধতিটি ক্রয়ের আদেশটি দেখেন, তখন আপনি ডিবাগ করেন, তাই আমি মূলত Base
প্রত্যয় হিসাবে ব্যবহার করার পরামর্শ দিয়েছিলাম বেস বেসড জন্য:
>>> Point.mro()
[<class '__main__.Point'>, <class '__main__.Point'>, <type 'tuple'>, <type 'object'>]
# ^^^^^---------------------^^^^^-- same names!
__dict__
যখন এটি ব্যবহার করে এমন একটি ক্লাস থেকে সাবক্লাসিং করার সময় সৃষ্টি রোধ করতে আপনাকে অবশ্যই এটি সাবক্লাসে ঘোষণা করতে হবে। আরও উত্তর দেওয়ার জন্য এই উত্তরটি__slots__
দেখুন ।
namedtuple
পুরোদস্তুর "অবজেক্ট" তে রূপান্তর করবে না ? এর মাধ্যমে নাম-টিপলস থেকে কিছু পারফরম্যান্স লাভ হারাচ্ছেন?