2012-03-11 2 views
0

J'écris une classe personnalisée qui enveloppe un dict. En tant que tel, je veux mettre en œuvre getitem pour cela. Je vais aussi utiliser des tuples comme clés dans cette dict. Cependant, lorsque j'essaie de passer un tuple à getitem, Python lance une KeyError. On dirait qu'il est jetant tuple à un int quand je passe à getitem:Comment utiliser les tuples comme paramètres pour __getitem __()?

code:

Class Board(object): 
    def __getitem__(self, key): 
    print "type in call: " + type(key) 
    return self.board[key] 

# in main somewhere 
board = Board() 

print "type before call: " + type((1, 2)) 
if (1, 2) in board: 
    print "It's there!" 

ouptut:

type before call: <type 'tuple'> 
type in call: <type 'int'> 

## traceback stuff ## 
KeyError: 0 

Conseil a besoin d'hériter d'un type de cartographie pour que Python soit heureux? Aussi, pourquoi Python essaie-t-il de faire ce casting en premier lieu?

+0

Vous essayez d'implémenter un test d'adhésion, regardez [Redeclaration de la méthode "in" dans une classe] (http://stackoverflow.com/q/9428419/1132524). –

Répondre

1

Le confinement itère sauf si __contains__() est implémenté. Alors, implémentez-le.

+0

Peut-être que vous voulez reformuler votre première phrase, car ce n'est pas vrai: ['__contains__' doc] (http://docs.python.org/py3k/reference/datamodel.html#object.__contains__) –

+0

@Rik:" Pour les objets qui ne définissent pas '__contains __()', le test d'appartenance tente d'abord l'itération via '__iter __()', puis l'ancien protocole d'itération de séquence via '__getitem __()' ... " –

+0

Alternativement, sous-classe de la [collection ABCs] (https://docs.python.org/2/library/collections.html#collections-abstract-base-classes) et laissez Python implémenter les parties ennuyeuses pour vous. – Kevin

Questions connexes