Il docs afferma che una classe è lavabile finché definisce il metodo __hash__
e il metodo __eq__
. Tuttavia:Che cosa rende inaffidabile una classe definita dall'utente?
class X(list):
# read-only interface of `tuple` and `list` should be the same, so reuse tuple.__hash__
__hash__ = tuple.__hash__
x1 = X()
s = {x1} # TypeError: unhashable type: 'X'
Cosa rende X
inattivo?
Si noti che è necessario disporre di elenchi identici (in termini di uguaglianza regolare) da sottoporre a hash allo stesso valore; altrimenti, io violate this requirement su funzioni hash:
L'unica proprietà richiesta è che gli oggetti che risultano uguali hanno lo stesso valore di hash
i documenti non avvertono che un oggetto hashabile non deve essere modificato durante la sua durata, e ovviamente non modifico le istanze di X
dopo la creazione. Ovviamente, l'interprete non lo controllerà comunque.
Sì, le interfacce di sola lettura sono gli stessi, ma perché si aspetta tuple .__ hash__ di usare solo le interfacce esterne di essa la propria classe? Soprattutto se scritto in C. L'uso delle interfacce esterne sarebbe molto più lento. Non puoi ragionevolmente aspettarti che un metodo dalla classe A funzioni per la classe B a meno che la classe B non sia sottoclassata dalla classe A. Hai provato a chiamare anche x1 .__ hash __() per vedere se ha funzionato? –
@LennartRegebro Sì, sono d'accordo ... Vedere il mio ultimo commento a http: //stackoverflow.com/a/10254636/336527 ... Ho appena avuto un blocco del cervello. – max