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
Était-ce utile?

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 ).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top