2013-04-08 2 views
1

Je ne suis pas du tout familier avec le concept de:Python Type unhashable: « OrderedDict »

TypeError: unhashable type: 'OrderedDict' 

Mais je ne peux pas comprendre comment la ligne suivante de code peut produire une telle pile trace.

89:  @staticmethod 
90:  def diff(var1, var2, path=[], level=0, curpath=[]): 
... 
101:  elif isinstance(var1, list) and isinstance(var2, list): 
102:   l1s = set(var1) 
103:   l2s = set(var2) 
104:   retlist = [] 

    File "myFile.py", line 102, in diff 
    l1s = set(var1) 
TypeError: unhashable type: 'OrderedDict' 

Comment ligne 102, dans le code ci-dessus jeter une telle exception?

+1

'var1' est une liste de' OrderedDict's. –

+1

En aparté, vous pouvez jeter un oeil à http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument – mgilson

+0

@PavelAnossov, je me tape la tête contre mon bureau maintenant :) merci, je ne sais pas comment j'ai raté ça! – theAlse

Répondre

2

Certaines structures de données (plus particulièrement dict de s et set s) exigent des objets qu'ils contiennent (clés dans le cas des dictionnaires, des articles dans le cas des ensembles) pour mettre en œuvre la méthode magique __hash__(), de sorte que l'appel hash(obj) retourne une valeur.

Ceci est nécessaire pour optimiser la structure, et avec l'immuabilité pour aider à garantir l'unicité des objets contenus.

Dans votre cas, var1 contient un objet qui n'est pas et qui est (il n'implémente pas hash()). Cet objet est un OrderedDict, qui est un objet mutable et qui n'est pas conçu par le design.

À titre d'exemple d'un autre type d'objet qui est mutable et non indexables par la conception, tenez compte list et cet exemple:

>>> L = [1, 2, 3] 
>>> set([L]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'list' 
>>> hash(L) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'list' 

Si vous utilisez set() pour garantir l'unicité alors vous devez aller d'une autre manière , bien que ce ne soit pas clair d'après votre question.

0

Les ensembles en python sont basés sur des hachages. OrderedDicts ne sont pas hashable.

0

dict (y compris OrderedDict) dans python sont des conteneurs mutables.

Si une dict était hachée, sa valeur de hachage serait modifiée tant que vous changiez le contenu de la dict.