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''