Python'un 'in' işleci geçersiz kılsın mı?


199

Python'da kendi sınıfımı yaratıyorsam, 'in' operatörünün kullanımına izin vermek için hangi işlevi tanımlamalıyım, örn.

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...

Aslında isve is notoperatörlerini nasıl geçersiz kılacağımı araştırıyordum . A gibi query = tinydb.Query().field == valueyazmak da mümkün Query().field is not None. Ama öyle görünüyor ki, şu an için bırakılıyorum __eq__ve __ne__bu da sessizliğe yol açıyor Query().field != None.
Tomasz Gandor

Yanıtlar:



194

Daha eksiksiz bir cevap:

class MyClass(object):

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

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

Burada 54 m olup olmadığını sorarken True alırsınız:

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

Aşırı yükleme__contains__ hakkındaki belgelere bakın .


@pthulin, sizinki kod açısından "daha eksiksiz" olabilir, ancak Ignacio'nun belgelere olan bağlantıları, bazıları için her zaman büyük bir artıdır.
Peter Hansen

16
@Peter. Evet, ama bazılarımız cevabın hoş, görsel bir temsilini tercih ediyoruz. Ignacio'nun soruları bize google yerine buraya yönlendirmekten başka bir şey yapamadı, hayır, teşekkürler.
Zoran Pavlovic

Zoran, katılıyorum, hatta diğerine değil de bu cevabı iptal ettim. Sadece gerçekten iyi bir cevabın her zaman dokümanlara bağlanması gerektiğine işaret ediyorum.
Peter Hansen

13
Hepsi, bağlantılar ölüyor ve bu yüzden Ignacio'nun cevabı SO'da titrek. Bağlantılar + örnek en iyisidir ve bu yüzden bahsettiğimiz iki cevabın bir kombinasyonu en iyisidir.
demongolem

1
@demongolem Resmi Python belgeleri, yorumlayıcı indirilemez hale geldiğinde veya sonrasında ölecektir. Ve bu sadece bağlantıya dayalı bir cevap değildir; Bu sayfaya cevabı aradım ve daha fazla bağlantıya tıklamadan buldum (yani prototip yeterliydi). Prensipte katılıyorum, ama burada geçerli olmayan imho.
wizzwizz4

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.