Bienvenue sur IndexError.

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

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

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 (408 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,206 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

...