2010-08-13 15 views
15

मैं namedtuple बनाना चाहता हूं जो एक छोटे से बिटफील्ड में व्यक्तिगत झंडे का प्रतिनिधित्व करता है। मैं इसे उपclass करने की कोशिश कर रहा हूं ताकि मैं टुपल बनने से पहले बिटफील्ड को अनपैक कर सकूं। हालांकि, मेरे वर्तमान प्रयास काम नहीं कर रहा:subclassing के माध्यम से एक नामांकित के कन्स्ट्रक्टर तर्क संशोधित?

class Status(collections.namedtuple("Status", "started checking start_after_check checked error paused queued loaded")): 
    __slots__ =() 

    def __new__(cls, status): 
     super(cls).__new__(cls, status & 1, status & 2, status & 4, status & 8, status & 16, status & 32, status & 64, status & 128) 

अब, super() के साथ मेरा अनुभव सीमित है और __new__ के साथ मेरा अनुभव (लगभग न के बराबर है, इसलिए मैं काफी क्या का बनाने के लिए यकीन नहीं है मुझे) गूढ़ त्रुटि TypeError: super.__new__(Status): Status is not a subtype of super। गुगलिंग और डॉक्स में खोदने से कुछ भी प्रबुद्ध नहीं हुआ है।

सहायता?

उत्तर

16

आप लगभग यह था :-) सिर्फ दो छोटे सुधार कर रहे हैं:

  1. नई विधि एक वापसी बयान की जरूरत है
  2. सुपर कॉल में दो तर्क होना चाहिए, सीएल और स्थिति

जिसके परिणामस्वरूप कोड इस तरह दिखता है:

import collections 

class Status(collections.namedtuple("Status", "started checking start_after_check checked error paused queued loaded")): 
    __slots__ =() 

    def __new__(cls, status): 
     return super(cls, Status).__new__(cls, status & 1, status & 2, status & 4, status & 8, status & 16, status & 32, status & 64, status & 128) 

यह सफाई से चलाता है, जैसा कि आप की उम्मीद थी:

>>> print Status(47) 
Status(started=1, checking=2, start_after_check=4, checked=8, error=0, paused=32, queued=0, loaded=0) 
+4

' सुपर (स्थिति, सीएलएस) '! – knite

10

मैं super से बचूंगा जबतक कि आप स्पष्ट रूप से एकाधिक विरासत को पूरा नहीं कर रहे हैं (उम्मीद है कि यहां मामला नहीं है ;-)। बस कुछ पसंद है ...:

def __new__(cls, status): 
    return cls.__bases__[0].__new__(cls, 
            status & 1, status & 2, status & 4, 
            status & 8, status & 16, status & 32, 
            status & 64, status & 128) 
+0

एक आकर्षण की तरह काम किया। धन्यवाद! –

+0

@ बेन, आपका स्वागत है! –

+4

आप इसका उपयोग करके कोड डुप्लिकेशंस को भी कम कर सकते हैं: 'रिटर्न सीएलएस .__ बेस __ [0] .__ नया __ (सीएलएस, * (स्थिति और (1 << x) x में रेंज (0, 8))) – thejoshwolfe

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