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.