write traductor traducir traduccion significa qué ingles gratis frases español diccionario buscar amor python dictionary methods instance hashable

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