Substituir o operador 'in' do Python?


197

Se estou criando minha própria classe em Python, que função devo definir para permitir o uso do operador 'in', por exemplo

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...

Eu estava realmente procurando como substituir o ise is notoperadores. Como um query = tinydb.Query().field == value, também poder escrever Query().field is not None. Mas parece que me resta __eq__e __ne__por enquanto, o que leva ao não-tônico Query().field != None. (sarc)
Tomasz Gandor

Respostas:



191

Uma resposta mais completa é:

class MyClass(object):

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

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

Aqui você obteria True ao perguntar se 54 estava em m:

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

Consulte a documentação sobre sobrecarga__contains__ .


@pthulin, o seu pode ser "mais completo" em termos de código, mas os links de Ignacio para a documentação, o que é sempre uma grande vantagem para alguns.
Peter Hansen

16
@Peter. Sim, mas alguns de nós preferem uma boa representação visual da resposta. Ignacio fez pouco para beneficiar a questão, além de nos direcionar aqui primeiro, em vez do google, não, obrigado.
Zoran Pavlovic

Zoran, eu concordo, e até votei essa resposta e não a outra. Estou apenas apontando que uma resposta realmente boa deve sempre estar vinculada a documentos, se disponível.
Peter Hansen

13
Todos os links morrem e é por isso que a resposta de Ignacio é instável no SO. Links + exemplo é o melhor e é por isso que é melhor uma combinação das duas respostas sobre as quais estamos falando.
Demongolem 05/12

1
@demongolem A documentação oficial do Python irá morrer com ou depois que o intérprete se tornar impossível de baixar. E não é uma resposta apenas para link; Cheguei a esta página procurando a resposta e a encontrei sem clicar em nenhum outro link (ou seja, o protótipo era suficiente). Eu concordo em princípio, mas imho que não se aplica aqui.
Wizzwizz4

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.