in protocollo per quanto riguarda la sequenza
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
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
.