Estoy tratando de usar un objeto como clave en un diccionario de Python, pero se está comportando de una manera que no puedo entender del todo.Objetos como claves en los diccionarios de Python
Primero crear un diccionario con mi objeto como la clave:
package_disseminators = {
ContentType("application", "zip", "http://other/property") : "one",
ContentType("application", "zip") : "two"
}
Ahora crear otro objeto que es "el mismo" como uno que es una clave.
content_type = ContentType("application", "zip", "http://other/property")
he dado el objeto ContentType encargo __eq__
y la costumbre __str__
métodos, tales que el método __eq__
compara el __str__
valores.
Ahora, algunos pitón interactivo:
>>> for key in package_disseminators:
... if key == content_type:
... print "match"
... else:
... print "no match"
...
no match
match
>>> content_type in package_disseminators.keys()
True
Ok, por lo que se parece a mi objeto sin duda está siendo identificado correctamente como una llave, por lo que:
>>> package_disseminators[content_type]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: (& (type="application/zip") (packaging="http://other/property"))
Er ... ok? Así que content_type está en la lista package_disseminators.keys(), pero no es una clave?
>>> package_disseminators.has_key(content_type)
False
Aparentemente no.
Supongo que el proceso de comparación que Python usa para determinar la igualdad difiere entre una declaración "in" directa en una lista y buscar una clave en un dict, pero no sé cómo. ¿Algún consejo o idea?
Algunas aclaraciones adicionales: Su objeto ya tiene un método '__hash__' heredado de' object'. Pero la implementación predeterminada arroja un valor único para cada instancia, por lo que dos instancias iguales tendrán hashes diferentes a menos que proporcione una mejor implementación. 'has_key' compara valores de hash,' in' verifica la igualdad, por eso 'has_key' falla mientras que' in' tiene éxito en tus ejemplos. –
Hola gente. Genial, gracias por esto, muy apreciado! –