Zastąpić operator „w” Pythona?

197

Jeśli tworzę własną klasę w Pythonie, jaką funkcję powinienem zdefiniować, aby umożliwić użycie operatora 'in', np.

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...
astrofrog
źródło
Właściwie szukałem sposobu na zastąpienie operatorów isi is not. Jak a query = tinydb.Query().field == value, także móc pisać Query().field is not None. Ale wydaje mi pozostało __eq__i __ne__na razie, co prowadzi do unpythonic Query().field != None. (sarc)
Tomasz Gandor

Odpowiedzi:

191

Pełniejsza odpowiedź to:

class MyClass(object):

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

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

Tutaj uzyskasz wartość Prawda, gdy zapytasz, czy 54 było wm:

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

Zobacz dokumentację dotyczącą przeciążenia__contains__ .

ftulina
źródło
@pthulin, twój może być „bardziej kompletny” pod względem kodu, ale linki Ignacio do dokumentacji, co dla niektórych jest zawsze dużym plusem.
Peter Hansen
16
@Piotr. Tak, ale niektórzy z nas wolą ładne, wizualne przedstawienie odpowiedzi. Ignacio niewiele zrobił, żeby skorzystać z tego pytania, oprócz skierowania nas tutaj najpierw zamiast google, nie, dziękuję.
Zoran Pavlovic
Zoran, zgadzam się, a ja nawet głosowałem za odpowiedzią, a nie drugą. Po prostu wskazuję, że naprawdę dobra odpowiedź powinna zawsze zawierać linki do dokumentów, jeśli są dostępne.
Peter Hansen
13
Wszystkie linki umierają i dlatego odpowiedź Ignacio jest niepewna w przypadku SO. Link + przykład jest najlepszy i dlatego kombinacja dwóch odpowiedzi, o których mówimy, jest najlepsza.
demongolem
1
@demongolem Oficjalna dokumentacja Pythona umrze wraz z tłumaczem lub po tym, jak interpreter stanie się niemożliwy do pobrania. I nie jest to odpowiedź tylko do łącza; Przyszedłem na tę stronę w poszukiwaniu odpowiedzi i znalazłem ją bez klikania dalszych linków (tj. Prototyp był wystarczający). Zgadzam się co do zasady, ale imho nie ma tutaj zastosowania.
wizzwizz4