Domanda

Come viene implementato a livello di pitone?

Ho un oggetto che finge di essere un dict per la maggior parte (a posteriori avrei dovuto solo subclassare dict, ma preferirei non refacturing la base di codice, e vorrei anche saperlo per il futuro riferimento), che assomiglia un po 'a

class configThinger(object):
    _config = {}
    def __getitem__(self, key):
        return self._config[key]
    def __setitem__(self, key, value):
        self._config[key] = value

Che funziona esattamente come dovrebbe e si comporta correttamente quando provo ad accedere ai suoi elementi come configThingerInstance ['qualunque' ']

Ma una chiamata come

t = configThinger()
t.populate() # Internal method that fills it with some useful data
if 'DEBUG' in t:
    doStuff()

si traduce in un KeyError sollevato perché presumibilmente il protocollo `in 'esegue una getitem () cercando la chiave in questione. Devo sollevare qualche altra eccezione per dire che non c'è? Preferirei non fare qualcosa del genere.

try:
    t['DEBUG']
except KeyError:
    pass
else:
    doStuff()

Inoltre, dov'è nella documentazione?

Mi guardavo intorno

http://docs.python.org/tutorial/datastructures.html

http://docs.python.org/library/stdtypes.html

ma tragicamente cercare di cercare su Google qualcosa di specifico per la parola 'in' è follia :(

MODIFICA 1:

Con una serie di stampe di traccia, posso vedere che il programma chiama configThingerInstance. getitem (0)

tuttavia

t = {'rawk': 1,
     'rawr': 2,
    }
t[0] # Raises KeyError
'thing' in t # returns False
È stato utile?

Soluzione

Sembra che tu voglia sovraccaricare l'operatore in?

Puoi farlo definendo il metodo __contains__ : http://docs.python.org/reference/datamodel.html#object. contiene

Altri suggerimenti

Per il miglior supporto per l'operatore in (contenimento noto anche come controllo dell'appartenenza), implementa il metodo speciale __contains__ sulla tua classe configThinger :

class configThinger(object):
    _config = {}
    def __getitem__(self, key):
        return self._config[key]
    def __setitem__(self, key, value):
        self._config[key] = value
    def __contains__(self, key):
        return key in self._config

i documenti sono qui (spiegando anche altri modi minori per supportare l'operatore in .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top