2010-01-30 23 views
26

मैं namedtuple._replace() को लागू करने में परेशानी हो रही थी में descrbed के रूप में काम नहीं करता है, तो मैं सही प्रलेखन के बंद कोड कॉपी:पायथन: namedtuple._replace() प्रलेखन

Point = namedtuple('Point', 'x,y') 

p = Point(x=11, y=22) 

p._replace(x=33) 

print p 

और मुझे मिल गया:

Point(x=11, y=22) 
बजाय

:

Point(x=33, y=22) 

के रूप में दस्तावेज़ में दिखाया गया है।

मैं अजगर 2.6 का उपयोग कर रहा विंडोज 7

पर क्या हो रहा है?

+6

यह वही काम करता है जैसे str.replace() करता है। दोनों स्ट्रिंग्स और नामित टुपल्स अपरिवर्तनीय हैं, इसलिए पुराने प्रतिस्थापन को अपरिवर्तित छोड़ते समय उनके प्रतिस्थापन विधियां * नए * मान उत्पन्न करती हैं। आपकी समस्या का समाधान नया परिणाम एक चर में सहेजना है। –

+0

महान प्रश्न अगर किसी अन्य कारण से किसी नाम पर "संशोधित" करने की इच्छा रखने वाले किसी भी कारण से इस पर यात्रा करने जा रहे हैं। – mbarkhau

उत्तर

68

हाँ यह होता है, यह वास्तव में के रूप में दस्तावेज काम करता है।

._replaceरिटर्न एक नया namedtuple, यह मूल को संशोधित नहीं करता है, ताकि आप इस बारे में की जरूरत है:

p = p._replace(x=33) 

यहाँ देखें: अधिक जानकारी के लिए somenamedtuple._replace(kwargs)

9

namedtuple._replace() एक नया ट्यूपल देता है; मूल अपरिवर्तित है।

+1

आप सभी को धन्यवाद। काश मैं सभी प्रतिक्रियाओं को स्वीकार कर सकता हूं। –

12

एक ट्यूपल अपरिवर्तनीय है। _replace() रिटर्न अपने संशोधनों के साथ एक नया टपल:

p = p._replace(x=33) 
6

ऐसा लगता है जैसे नामित अपरिवर्तनीय है, जैसे कि इसके अग्रदूत, टुपल।

>>> from collections import namedtuple 
>>> Point = namedtuple('Point', 'x,y') 
>>> 
>>> p = Point(x=11, y=22) 
>>> 
>>> p._replace(x=33) 
Point(x=33, y=22) 
>>> print(p) 
Point(x=11, y=22) 
>>> p = p._replace(x=33) 
>>> print(p) 
Point(x=33, y=22) 

NamedTuple._replace एक ही प्रकार की एक नई NamedTuple रिटर्न लेकिन मूल्यों के साथ बदल दिया है।

+4

FWIW, विधि का नाम str.replace() से प्रेरित था जिसमें उपयोग के उल्लेखनीय समान पैटर्न हैं :-) '' s = 'त्वरित ब्राउन लोमड़ी'; s = s.replace ('quick', 'slow') '' –

+3

रेमंड हेटिंगर? सम्मानित किया गया। – hughdbrown

संबंधित मुद्दे