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

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


@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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.