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?
Danke, nur den Konstruktor in der Unterklasse weggelassen das Problem behoben. –
Beachten Sie, dass 'repr (foo)' immer noch von 'Foo' spricht. Dies könnte besser als 'Klasse Foo (namedtuple ('Foo', ['item1', 'item2'], ausführliche = False)):' –
@ Svens Antwort [hier] (http: // stackoverflow. com/fragen/4901815/Objekt-von-benutzerdefinierten-Typ-als-Wörterbuch-Schlüssel) –