2010-07-11 10 views
13

कहो मैं एक namedtuple इस तरह है के साथ एक namedtuple बनाना:एक कस्टम हैश फंक्शन

FooTuple = namedtuple("FooTuple", "item1, item2") 

और मैं निम्नलिखित समारोह हैशिंग लिए इस्तेमाल किया जा करना चाहते हैं अप्रासंगिक होने के लिए item1 और item2 का आदेश चाहते हैं (मैं तुलना-ऑपरेटर के लिए भी ऐसा ही करूंगा)। मैंने ऐसा करने के दो तरीकों के बारे में सोचा। पहले होगा:

FooTuple.__hash__ = foo_hash 

यह काम करता है, लेकिन यह काट दिया महसूस करता है। इसलिए मैं उपवर्गीकरण FooTuple की कोशिश की:

class EnhancedFooTuple(FooTuple): 
    def __init__(self, item1, item2): 
     FooTuple.__init__(self, item1, item2) 

    # custom hash function here 

लेकिन तब मैं इस मिल:

DeprecationWarning: object.__init__() takes no parameters 

तो, मैं क्या कर सकता है? या यह एक बुरा विचार है और मुझे सिर्फ अपनी कक्षा को खरोंच से लिखना चाहिए?

उत्तर

18

मुझे लगता है कि वहाँ कुछ अपने कोड के साथ गलत है (मेरा अनुमान है, कि आप एक ही नाम के साथ टपल का एक उदाहरण बनाया है, इसलिए fooTuple अब एक टपल, नहीं एक टपल वर्ग है), क्योंकि इस तरह का नाम दिया टपल उपवर्गीकरण कार्य करना चाहिए। वैसे भी, आपको कन्स्ट्रक्टर को फिर से परिभाषित करने की आवश्यकता नहीं है। आप केवल हैश फ़ंक्शन जोड़ सकते हैं:

In [1]: from collections import namedtuple 

In [2]: Foo = namedtuple('Foo', ['item1', 'item2'], verbose=False) 

In [3]: class ExtendedFoo(Foo): 
    ...:  def __hash__(self): 
    ...:   return hash(self.item1) * hash(self.item2) 
    ...: 

In [4]: foo = ExtendedFoo(1, 2) 

In [5]: hash(foo) 
Out[5]: 2 
+0

धन्यवाद, बस उपclass में कन्स्ट्रक्टर को छोड़कर समस्या को हल किया गया है। –

+11

ध्यान दें कि 'repr (foo) 'अभी भी' Foo' की बात कर रहा है। यह 'कक्षा फू (नामांकित (' फू ', [' item1 ',' item2 '], verbose = झूठी) के रूप में बेहतर किया जा सकता है): –

+0

@ स्वेन के उत्तर पर ध्यान दें [यहां] (http: // stackoverflow। com/प्रश्न/4901815/वस्तु के- कस्टम प्रकार के रूप में शब्दकोश-कुंजी) –

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