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

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


@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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.