टुपल्स नाम क्या हैं?
टपल नाम का एक टपल है।
यह सब कुछ एक गुदगुदी कर सकता है।
लेकिन यह सिर्फ एक तुक से अधिक है।
यह एक टपल का एक विशिष्ट उपवर्ग है, जिसे प्रोग्राम्ड रूप से आपके विनिर्देशन के लिए बनाया गया है, जिसका नाम फ़ील्ड और निश्चित लंबाई है।
यह, उदाहरण के लिए, टपल का एक उपवर्ग बनाता है, और निश्चित लंबाई (इस मामले में, तीन) के होने से अलग, इसे हर जगह इस्तेमाल किया जा सकता है बिना टूटे उपयोग किया जाता है। इसे लिसकोव प्रतिस्थापन के रूप में जाना जाता है।
पायथन 3.6 में नया , हमtyping.NamedTuple
एक नामांकित बनाने केलिए एक वर्ग परिभाषा का उपयोग कर सकते हैं:
from typing import NamedTuple
class ANamedTuple(NamedTuple):
"""a docstring"""
foo: int
bar: str
baz: list
ऊपर वाला नीचे के समान है, सिवाय इसके कि ऊपर अतिरिक्त रूप से एनोटेशन और एक डॉकस्ट्रिंग है। नीचे पायथन 2+ में उपलब्ध है:
>>> from collections import namedtuple
>>> class_name = 'ANamedTuple'
>>> fields = 'foo bar baz'
>>> ANamedTuple = namedtuple(class_name, fields)
यह इसे तुरंत करता है:
>>> ant = ANamedTuple(1, 'bar', [])
हम इसका निरीक्षण कर सकते हैं और इसकी विशेषताओं का उपयोग कर सकते हैं:
>>> ant
ANamedTuple(foo=1, bar='bar', baz=[])
>>> ant.foo
1
>>> ant.bar
'bar'
>>> ant.baz.append('anything')
>>> ant.baz
['anything']
गहरा विवेचन
टुपल्स को समझने के लिए, आपको सबसे पहले यह जानना होगा कि टुपल क्या है। एक ट्यूपल अनिवार्य रूप से एक अपरिवर्तनीय है (मेमोरी में इन-प्लेस नहीं बदला जा सकता है)।
यहां बताया गया है कि आप नियमित रूप से कैसे काम कर सकते हैं:
>>> student_tuple = 'Lisa', 'Simpson', 'A'
>>> student_tuple
('Lisa', 'Simpson', 'A')
>>> student_tuple[0]
'Lisa'
>>> student_tuple[1]
'Simpson'
>>> student_tuple[2]
'A'
आप चलने योग्य अनपैकिंग के साथ टपल का विस्तार कर सकते हैं:
>>> first, last, grade = student_tuple
>>> first
'Lisa'
>>> last
'Simpson'
>>> grade
'A'
नामांकित tuples tuples हैं जो अपने तत्वों को सिर्फ इंडेक्स के बजाय नाम से एक्सेस करने की अनुमति देते हैं!
आप इस तरह एक नामांकित बनाते हैं:
>>> from collections import namedtuple
>>> Student = namedtuple('Student', ['first', 'last', 'grade'])
आप रिक्त स्थान द्वारा अलग किए गए नामों के साथ एक भी स्ट्रिंग का उपयोग कर सकते हैं, एपीआई का थोड़ा अधिक पठनीय उपयोग:
>>> Student = namedtuple('Student', 'first last grade')
उनका उपयोग कैसे करें?
आप कर सकते हैं सब कुछ कर सकते हैं tuples कर सकते हैं (ऊपर देखें) और साथ ही साथ निम्न कार्य करें:
>>> named_student_tuple = Student('Lisa', 'Simpson', 'A')
>>> named_student_tuple.first
'Lisa'
>>> named_student_tuple.last
'Simpson'
>>> named_student_tuple.grade
'A'
>>> named_student_tuple._asdict()
OrderedDict([('first', 'Lisa'), ('last', 'Simpson'), ('grade', 'A')])
>>> vars(named_student_tuple)
OrderedDict([('first', 'Lisa'), ('last', 'Simpson'), ('grade', 'A')])
>>> new_named_student_tuple = named_student_tuple._replace(first='Bart', grade='C')
>>> new_named_student_tuple
Student(first='Bart', last='Simpson', grade='C')
एक टिप्पणीकार ने पूछा:
एक बड़ी स्क्रिप्ट या कार्यक्रम में, आमतौर पर एक नामित टपल को कहां परिभाषित किया जाता है?
आपके द्वारा बनाए गए प्रकार namedtuple
मूल रूप से कक्षाएं हैं जिन्हें आप आसान शॉर्टहैंड के साथ बना सकते हैं। उनके साथ कक्षाओं की तरह व्यवहार करें। उन्हें मॉड्यूल स्तर पर परिभाषित करें, ताकि अचार और अन्य उपयोगकर्ता उन्हें ढूंढ सकें।
वैश्विक मॉड्यूल स्तर पर काम करने का उदाहरण:
>>> from collections import namedtuple
>>> NT = namedtuple('NT', 'foo bar')
>>> nt = NT('foo', 'bar')
>>> import pickle
>>> pickle.loads(pickle.dumps(nt))
NT(foo='foo', bar='bar')
और यह परिभाषा को देखने में विफलता को दर्शाता है:
>>> def foo():
... LocalNT = namedtuple('LocalNT', 'foo bar')
... return LocalNT('foo', 'bar')
...
>>> pickle.loads(pickle.dumps(foo()))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
_pickle.PicklingError: Can't pickle <class '__main__.LocalNT'>: attribute lookup LocalNT on __main__ failed
मुझे सामान्य ट्यूपल्स के बजाय टुपल्स का उपयोग क्यों / कब करना चाहिए?
जब यह आपके कोड में सुधार करता है, तो आपके कोड में व्यक्त किए गए टपल तत्वों के शब्दार्थ को सुधारता है।
यदि आप अन्यथा अपरिवर्तित डेटा विशेषताओं और किसी कार्यक्षमता के साथ किसी ऑब्जेक्ट का उपयोग करेंगे, तो आप ऑब्जेक्ट के बजाय उनका उपयोग कर सकते हैं।
उदाहरण के लिए, कार्यक्षमता जोड़ने के लिए आप उन्हें भी उपवर्गित कर सकते हैं :
class Point(namedtuple('Point', 'x y')):
"""adding functionality to a named tuple"""
__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)
नामित ट्यूपल्स के बजाय मुझे सामान्य ट्यूपल्स का उपयोग क्यों / कब करना चाहिए?
यह संभवत: नामित ट्यूपल्स से ट्यूपल्स का उपयोग करने के लिए एक प्रतिगमन होगा। अपफ्रंट डिज़ाइन निर्णय केंद्रों के इर्द-गिर्द है कि क्या शामिल अतिरिक्त कोड से लागत में सुधार पठनीयता के लायक है जब टुपल का उपयोग किया जाता है।
ट्यूपल्स बनाम ट्यूपल्स नाम से उपयोग की जाने वाली कोई अतिरिक्त मेमोरी नहीं है।
क्या किसी प्रकार की "नामित सूची" (नामित टपल का एक परिवर्तनशील संस्करण) है?
आप या तो एक स्लेटेड ऑब्जेक्ट की तलाश कर रहे हैं, जो एक स्टेटिकली साइज़ लिस्ट या सबक्लासिड लिस्ट की कार्यक्षमता को लागू करता है, जो नामांकित टपल की तरह काम करता है (और यह किसी भी तरह लिस्ट को आकार में बदलने से रोकता है।)
अब विस्तार किया गया है, और शायद लिस्कोव को भी प्रतिस्थापित किया जा सकता है, पहला उदाहरण:
from collections import Sequence
class MutableTuple(Sequence):
"""Abstract Base Class for objects that work like mutable
namedtuples. Subclass and define your named fields with
__slots__ and away you go.
"""
__slots__ = ()
def __init__(self, *args):
for slot, arg in zip(self.__slots__, args):
setattr(self, slot, arg)
def __repr__(self):
return type(self).__name__ + repr(tuple(self))
# more direct __iter__ than Sequence's
def __iter__(self):
for name in self.__slots__:
yield getattr(self, name)
# Sequence requires __getitem__ & __len__:
def __getitem__(self, index):
return getattr(self, self.__slots__[index])
def __len__(self):
return len(self.__slots__)
और उपयोग करने के लिए, बस उपवर्ग और परिभाषित करें __slots__
:
class Student(MutableTuple):
__slots__ = 'first', 'last', 'grade' # customize
>>> student = Student('Lisa', 'Simpson', 'A')
>>> student
Student('Lisa', 'Simpson', 'A')
>>> first, last, grade = student
>>> first
'Lisa'
>>> last
'Simpson'
>>> grade
'A'
>>> student[0]
'Lisa'
>>> student[2]
'A'
>>> len(student)
3
>>> 'Lisa' in student
True
>>> 'Bart' in student
False
>>> student.first = 'Bart'
>>> for i in student: print(i)
...
Bart
Simpson
A