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.