Próbuję użyć obiektu jako klucza w słowniku Pythona, ale zachowuję się w sposób, którego nie mogę całkiem zrozumieć.obiekty jako klucze w słownikach Pythona
Najpierw utworzyć słownik z mojego obiektu jako klucz:
package_disseminators = {
ContentType("application", "zip", "http://other/property") : "one",
ContentType("application", "zip") : "two"
}
Teraz utworzyć inny obiekt, który jest „taki sam”, jak ten, który jest kluczowy.
content_type = ContentType("application", "zip", "http://other/property")
daję przedmiotu ContentType niestandardowy __eq__
i niestandardowych __str__
metody, takie, że sposób __eq__
porównuje wartości __str__
.
Teraz, niektóre interaktywne Python:
>>> 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, więc wygląda na to mojego obiektu jest zdecydowanie są zidentyfikowane odpowiednio jako klucz, tak:
>>> 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? Więc content_type znajduje się na liście packages_disseminators.keys(), ale nie jest kluczem?
>>> package_disseminators.has_key(content_type)
False
Najwyraźniej nie.
Zakładam, że proces porównywania, który Python używa do określenia równości, różni się od prostej instrukcji "in" na liście i faktycznie szuka klucza w dykcie, ale nie wiem jak. Wszelkie wskazówki lub spostrzeżenia?
Kilka dodatkowych wyjaśnień: Twój obiekt ma już metodę '__hash__' dziedziczoną po' obiekcie'. Ale domyślna implementacja zwraca unikalną wartość dla każdej instancji, więc dwa równe wystąpienia będą miały różne wartości haszowania, chyba że zapewnimy lepszą implementację. 'has_key' porównuje wartości mieszania,' in' sprawdza równość, dlatego 'has_key' kończy się niepowodzeniem, a' in' kończy się powodzeniem w twoich przykładach. –
Witajcie. Świetnie, dzięki za to, bardzo docenione! –