¿Anular el operador 'in' de Python?

197

Si estoy creando mi propia clase en Python, qué función debería definir para permitir el uso del operador 'in', por ejemplo

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...
astrofrog
fuente
En realidad estaba buscando cómo anular los operadores isy is not. Como a query = tinydb.Query().field == value, también poder escribir Query().field is not None. Pero parece que me quedo con __eq__y __ne__por el momento, lo que lleva a lo poco pitónico Query().field != None. (sarc)
Tomasz Gandor

Respuestas:

191

Una respuesta más completa es:

class MyClass(object):

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

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

Aquí obtendría True al preguntar si 54 estaba en m:

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

Ver documentación sobre sobrecarga__contains__ .

Pthulin
fuente
@thulin, el tuyo puede ser "más completo" en términos de código, pero los enlaces de Ignacio a la documentación, que siempre es una gran ventaja para algunos.
Peter Hansen
16
@Peter. Sí, pero algunos de nosotros preferimos una buena representación visual de la respuesta. Ignacio hizo poco para beneficiar la pregunta aparte de dirigirnos aquí primero en lugar de google, no, gracias.
Zoran Pavlovic
Zoran, estoy de acuerdo, e incluso voté por esta respuesta y no por la otra. Solo estoy señalando que una respuesta realmente buena siempre debe vincularse a documentos, si está disponible.
Peter Hansen el
13
Todos, los enlaces mueren y es por eso que la respuesta de Ignacio es inestable en SO. El ejemplo de Links + es el mejor y es por eso que es mejor una combinación de las dos respuestas de las que estamos hablando.
demongolem
1
@demongolem La documentación oficial de Python morirá con o después de que el intérprete no se pueda descargar. Y no es una respuesta de solo enlace; Llegué a esta página buscando la respuesta y la encontré sin hacer clic en ningún enlace adicional (es decir, el prototipo era suficiente). Estoy de acuerdo en principio, pero en mi opinión, eso no se aplica aquí.
wizzwizz4