python - traducir - traductor de frases en ingles a español gratis
¿Por qué no puedo invocar hash() en un método aparentemente fácil de usar de una instancia inhábil? (2)
Digamos que tengo un diccionario:
>>> d = {}
Tiene un método clear()
:
>>> d.clear
<built-in method clear of dict object at 0x7f209051c988>
... que tiene un atributo __hash__
:
>>> d.clear.__hash__
<method-wrapper ''__hash__'' of builtin_function_or_method object at 0x7f2090456288>
... que es invocable:
>>> callable(d.clear.__hash__)
True
Entonces, ¿por qué no puedo hash?
>>> hash(d.clear)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: ''dict''
Nota: Sé que los objetos dict
son inalterables. Tengo curiosidad de por qué esta restricción se extiende a sus métodos, aunque, como se señaló anteriormente, parecen afirmar lo contrario.
Es un método vinculado, y los métodos vinculados tienen una referencia a self
, por ejemplo, el diccionario. Esto hace que el método no sea manejable.
Puede dict.clear
hash al método dict.clear
sin dict.clear
:
>>> d = {}
>>> d.clear.__self__
{}
>>> d.clear.__self__ is d
True
>>> hash(d.clear)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: ''dict''
>>> hash(dict.clear)
-9223372036586189204
Los métodos en instancias que son hashable serán también hashable, por lo que el tipo de objeto para los métodos enlazados incorporados implementa un método __hash__
pero provoca TypeError
cuando el atributo __self__ no es hashable. Esto es consistente con la documentación del método del object.__hash__
; si puede establecerlo en None
o no implementarlo en absoluto, entonces es preferible, pero para estos casos donde la capacidad de acceso solo se conoce en tiempo de ejecución, la única opción disponible es generar un TypeError
.
Martijn tiene razón, como muy a menudo lo es. Si tienes una subclase dict
que implementa el método __hash__
, incluso los métodos enlazados se vuelven hashable
class MyHashableDict(dict):
def __hash__(self):
return 42
x = MyHashableDict()
print(x, hash(x), hash(x.clear))
y = {}
print(y, hash(y.clear))
Salida:
{} 42 287254
Traceback (most recent call last):
File "y.py", line 9, in <module>
print(hash(y.clear))
TypeError: unhashable type: ''dict''