en protocole en ce qui concerne la séquence
Question
Comment cela est-il implémenté au niveau python?
J'ai un objet qui prétend être un dict pour la plupart (rétrospectivement, j'aurais dû sous-classer le dict, mais je préfère ne pas refactoriser la base de code, et j'aimerais aussi le savoir pour l'avenir référence), qui ressemble un peu à
class configThinger(object):
_config = {}
def __getitem__(self, key):
return self._config[key]
def __setitem__(self, key, value):
self._config[key] = value
Qui fonctionne exactement comme il est supposé et se comporte correctement lorsque j'essaie d'accéder à ses éléments en tant que configThingerInstance ['quel que soit']
Mais un appel comme
t = configThinger()
t.populate() # Internal method that fills it with some useful data
if 'DEBUG' in t:
doStuff()
entraîne la génération d'une erreur KeyError, car le protocole `in 'effectue vraisemblablement une recherche getitem () pour la clé en question. Dois-je lever une autre exception pour dire que ce n’est pas là? Je préfère ne pas faire quelque chose comme ça.
try:
t['DEBUG']
except KeyError:
pass
else:
doStuff()
De plus, où se trouve cette documentation dans la documentation?
Je cherchais autour
http://docs.python.org/tutorial/datastructures.html
http://docs.python.org/library/stdtypes.html
mais essayer tragiquement de rechercher quelque chose de spécifique dans le mot "in" est folie: (
EDIT 1:
Avec une pile d'impressions de trace, je peux voir que le programme appelle configThingerInstance. getitem (0)
cependant
t = {'rawk': 1,
'rawr': 2,
}
t[0] # Raises KeyError
'thing' in t # returns False
La solution
Vous semblez vouloir surcharger l'opérateur in?
Vous pouvez le faire en définissant la méthode __ contient __
: http://docs.python.org/reference/datamodel.html#object. contient
Autres conseils
Pour une meilleure prise en charge de l'opérateur dans
(confinement ou vérification de l'appartenance), implémentez la méthode spéciale __ contient __
sur votre classe configThinger
:
class configThinger(object):
_config = {}
def __getitem__(self, key):
return self._config[key]
def __setitem__(self, key, value):
self._config[key] = value
def __contains__(self, key):
return key in self._config
Les documents sont ici (explique également autres moyens moins importants de prendre en charge l’opérateur dans
).