2012-05-07 4 views
8

में वर्ग टाइपनाम का उपयोग किसी विशेष वर्ग से जुड़े टाइपनाम का उपयोग क्या है? उदाहरण के लिए,पायथन

Point = namedtuple('P', ['x', 'y']) 

कहाँ आप सामान्य रूप से typename 'पी' का प्रयोग करेंगे?

धन्यवाद! ,

>>> from collections import namedtuple 
>>> Point = namedtuple('P','x y') 
>>> pp = Point(1,2) 
>>> type(pp) 
<class '__main__.P'> 

isinstance इस बारे में भी चिंतित नहीं है, हालांकि अभी क्या 'पी' है:

+0

संभव डुप्लिकेट [पायथन में "नामित टुपल्स" क्या हैं?] (Http://stackoverflow.com/questions/2970608/what-are-named-tuples-in-python) – b4hand

उत्तर

13

बस विवेक की खातिर, namedtuple को पहला तर्क आप के लिए असाइन करें चर नाम के रूप में एक ही होना चाहिए ज्ञात नहीं है:

>>> isinstance(pp,Point) 
True 
>>> isinstance(pp,P) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'P' is not defined 

लेकिन अचार एक मॉड्यूल है कि classname कि typename से मेल खाता है खोजने के बारे में परवाह करता है है:

>>> import pickle 
>>> ppp = pickle.dumps(pp) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "c:\python26\lib\pickle.py", line 1366, in dumps 
    Pickler(file, protocol).dump(obj) 
    File "c:\python26\lib\pickle.py", line 224, in dump 
    self.save(obj) 
    File "c:\python26\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "c:\python26\lib\pickle.py", line 401, in save_reduce 
    save(args) 
    File "c:\python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "c:\python26\lib\pickle.py", line 562, in save_tuple 
    save(element) 
    File "c:\python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "c:\python26\lib\pickle.py", line 748, in save_global 
    (obj, module, name)) 
pickle.PicklingError: Can't pickle <class '__main__.P'>: it's not found as __main__.P 

अगर मैं 'प्वाइंट' के रूप में परिभाषित namedtuple, तो अचार खुश है:

>>> Point = namedtuple('Point','x y') 
>>> pp = Point(1,2) 
>>> ppp = pickle.dumps(pp) 
>>> 

दुर्भाग्य से, यह आप पर निर्भर इस स्थिरता प्रबंधन करने के लिए है। नामांकित करने के लिए कोई तरीका नहीं है कि आप इसका आउटपुट कितना आवंटित कर रहे हैं, क्योंकि असाइनमेंट एक कथन है और पाइथन में ऑपरेटर नहीं है, इसलिए आपको सही वर्गनाम को नामांकित में पास करना होगा, और परिणामी वर्ग को एक वैरिएबल को असाइन करना होगा नाम।

+1

आपको ' .split() 'फ़ील्ड नामों पर, यह [स्वचालित रूप से किया जाता है] (http://docs.python.org/library/collections#collections.namedtuple) यदि आप स्ट्रिंग के रूप में नाम निर्दिष्ट करते हैं। अन्यथा +1 – mata

+0

आह, धन्यवाद! मैंने थोड़ी देर में नामांकित नहीं किया है, बस ओपी के प्रारूप की नकल कर रहा था। मैं पाइपर्सिंग के 'वनऑफ' फ़ंक्शन में कुछ ऐसा ही करता हूं। – PaulMcG

+3

डिफ़ॉल्ट 'repr' भी है: आप' प्वाइंट (x = 1, y = 2) 'चाहते हैं,' पी (x = 1, y = 2) 'नहीं। –