Sostituire l'operatore 'in' di Python?


197

Se sto creando la mia classe in Python, quale funzione dovrei definire in modo da consentire l'uso dell'operatore 'in', ad es.

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...

In realtà stavo cercando come sovrascrivere gli operatori ise is not. Come un query = tinydb.Query().field == value, anche essere in grado di scrivere Query().field is not None. Ma sembra che mi rimanga con __eq__e __ne__per il momento, il che porta al non ritmico Query().field != None. (sarc)
Tomasz Gandor,

Risposte:



191

Una risposta più completa è:

class MyClass(object):

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

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

Qui potresti ottenere True quando chiedi se 54 fosse in m:

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

Vedere la documentazione sul sovraccarico__contains__ .


@pthulin, il tuo potrebbe essere "più completo" in termini di codice, ma i collegamenti di Ignacio alla documentazione, che è sempre un grande vantaggio per alcuni.
Peter Hansen,

16
@Peter. Sì, ma alcuni di noi preferiscono una bella rappresentazione visiva della risposta. Ignacio ha fatto ben poco a beneficio della domanda oltre a dirigerci qui prima invece di google, no grazie.
Zoran Pavlovic,

Zoran, sono d'accordo, e ho persino votato questa risposta e non l'altra. Sto solo sottolineando che una risposta davvero valida dovrebbe sempre essere collegata ai documenti, se disponibili.
Peter Hansen,

13
Tutti, i collegamenti muoiono ed è per questo che la risposta di Ignacio è traballante su SO. Link + esempio è il migliore ed è per questo che una combinazione delle due risposte di cui stiamo parlando è la migliore.
demongolem,

1
@demongolem La documentazione ufficiale di Python morirà con o dopo che l'interprete diventa scaricabile. E non è una risposta solo link; Sono arrivato a questa pagina cercando la risposta e l'ho trovata senza fare clic su altri collegamenti (cioè il prototipo era sufficiente). Sono d'accordo in linea di principio, ma imho che non si applica qui.
wizzwizz4,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.