Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Peut-on utiliser une instance de classe comme clé d'un dico ?

+4 votes

Dans mon code j'ai des classes que j'utilise comme clé d'un dico

class Foo():
    pass

class Bar():
    pass

foo = Foo()
bar = Bar()
dico = {foo:bar}
assert dico[foo] is bar

Ça fonctionne, mais est-ce que ca marche dans tous les cas, quelle que soit l'instance utilisée comme clé ? Je viens de lire l'article sur les hashables de sam et max (http://sametmax.com/les-trucmuchables-en-python/) qui précise que les instances sont mutables et les objets mutables non hashables par défaut.
Alors pourquoi ce code marche ?

demandé 14-Sep-2016 par toub (430 points)

1 Réponse

+7 votes
 
Meilleure réponse

Tu peux, car l'implémentation par défaut de __hash__ est suffisante, car elle se base sur id, qui est unique par objet.
Ce qui explique le code suivant:

class Foo():
    def __init__(self, bar):
        self.bar = bar

f = Foo(1)
s = {f}
f.bar = 2
s.add(f)  # ne fait rien, car f garde le même id, même après changement de valeur
assert len(s) == 1

Redéfinir le hash est utile pour les objets dont les instances ayant les même valeurs d'attributs sont considérées identiques:

class Foo:

    def __init__(self, bar):
        self.bar = bar

    def __hash__(self):
        return hash(self.bar)

    def __eq__(self, othr):
        return self.bar == othr.bar

assert len({Foo(1), Foo(1)}) == 1
répondu 14-Sep-2016 par lucas (2,340 points)
edité 14-Sep-2016 par lucas

OK je me rends compte que j'avais mal compris l'article de Sam. Merci pour ta réponse

...