dire che ho un namedtuple
come questo:Creazione di un namedtuple con una funzione di hash personalizzato
FooTuple = namedtuple("FooTuple", "item1, item2")
e voglio la seguente funzione da utilizzare per l'hashing:
foo_hash(self):
return hash(self.item1) * (self.item2)
voglio questo perché ho voglio che l'ordine di item1
e di item2
sia irrilevante (farò lo stesso per l'operatore di confronto). Ho pensato a due modi per farlo. Il primo sarebbe:
FooTuple.__hash__ = foo_hash
Questo funziona, ma si sente violato. Così ho provato subclassing FooTuple
:
class EnhancedFooTuple(FooTuple):
def __init__(self, item1, item2):
FooTuple.__init__(self, item1, item2)
# custom hash function here
Ma allora ottengo questo:
DeprecationWarning: object.__init__() takes no parameters
Allora, cosa posso fare? O è una pessima idea e dovrei scrivere la mia classe da zero?
Grazie, lasciando il costruttore nella sottoclasse ha risolto il problema. –
Nota che 'repr (foo)' continuerà a parlare di 'Foo'. Questo potrebbe essere fatto meglio come 'class Foo (namedtuple ('Foo', ['item1', 'item2'], verbose = False)):' –
presta attenzione alla risposta @ Sven [qui] (http: // stackoverflow. com/domande/4901815/oggetto-del-custom-type-as-dizionario-chiave) –