Remplacer l'opérateur 'in' de Python?

197

Si je crée ma propre classe en Python, quelle fonction dois-je définir afin de permettre l'utilisation de l'opérateur 'in', par exemple

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...
astrofrog
la source
En fait, je cherchais comment remplacer les opérateurs iset is not. Comme un query = tinydb.Query().field == value, pour pouvoir aussi écrire Query().field is not None. Mais il semble que je me retrouve avec __eq__et __ne__pour le moment, ce qui conduit à l'impie Query().field != None. (sarc)
Tomasz Gandor

Réponses:

191

Une réponse plus complète est:

class MyClass(object):

    def __init__(self):
        self.numbers = [1,2,3,4,54]

    def __contains__(self, key):
        return key in self.numbers

Ici, vous obtiendrez True en demandant si 54 était en m:

>>> m = MyClass()
>>> 54 in m
True  

Voir la documentation sur la surcharge__contains__ .

pthuline
la source
@pthulin, le vôtre peut être "plus complet" en termes de code, mais les liens d'Ignacio vers la documentation, qui est toujours un gros plus pour certains.
Peter Hansen
16
@PEter. Oui, mais certains d'entre nous préfèrent une belle représentation visuelle de la réponse. Ignacio n'a pas fait grand-chose pour la question à part nous diriger ici d'abord au lieu de google, non merci.
Zoran Pavlovic
Zoran, je suis d'accord, et j'ai même voté pour cette réponse et pas pour l'autre. Je souligne simplement qu'une bonne réponse devrait toujours être liée à des documents, si disponibles.
Peter Hansen
13
Tous, les liens meurent et c'est pourquoi la réponse d'Ignacio est fragile sur SO. Liens + exemple est le meilleur et c'est pourquoi une combinaison des deux réponses dont nous parlons est la meilleure.
demongolem
1
@demongolem La documentation officielle de Python mourra avec ou après que l'interpréteur devienne téléchargeable. Et ce n'est pas une réponse uniquement liée à un lien; Je suis venu sur cette page à la recherche de la réponse et je l'ai trouvée sans cliquer sur d'autres liens (c'est-à-dire que le prototype était suffisant). Je suis d'accord en principe, mais à mon humble avis, cela ne s'applique pas ici.
wizzwizz4