2010-07-11 14 views
13

Sagen, ich habe eine namedtuple wie folgt aus:Erstellen eines namedtuple mit einem benutzerdefinierten Hash-Funktion

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

und ich möchte die folgende Funktion für Hashing verwendet werden:

foo_hash(self): 
    return hash(self.item1) * (self.item2) 

ich das will, weil ich möchte die Reihenfolge item1 und item2 irrelevant sein (ich werde das gleiche für den Vergleichsoperator tun). Ich dachte über zwei Möglichkeiten nach, dies zu tun. Die erste wäre:

FooTuple.__hash__ = foo_hash 

Das funktioniert, aber es fühlt sich gehackt an. Also habe ich versucht Subklassifizieren FooTuple:

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

    # custom hash function here 

Aber dann bekomme ich diese:

DeprecationWarning: object.__init__() takes no parameters 

Also, was kann ich tun? Oder ist das überhaupt eine schlechte Idee und ich sollte meine eigene Klasse von Grund auf schreiben?

Antwort

18

Ich denke, dass etwas falsch mit Ihrem Code ist (meine Vermutung ist, dass Sie eine Instanz des Tupel mit dem gleichen Namen erstellt, so fooTuple ist jetzt ein Tupel, keine Tuple-Klasse), da Unterklasse das benannte Tupel so sollte arbeiten. Wie auch immer, Sie müssen den Konstruktor nicht neu definieren. Sie können nur die Hash-Funktion hinzufügen:

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

Danke, nur den Konstruktor in der Unterklasse weggelassen das Problem behoben. –

+11

Beachten Sie, dass 'repr (foo)' immer noch von 'Foo' spricht. Dies könnte besser als 'Klasse Foo (namedtuple ('Foo', ['item1', 'item2'], ausführliche = False)):' –

+0

@ Svens Antwort [hier] (http: // stackoverflow. com/fragen/4901815/Objekt-von-benutzerdefinierten-Typ-als-Wörterbuch-Schlüssel) –

Verwandte Themen