in Protokoll in Bezug auf Sequenz
Frage
Wie dies bei einer Python-Ebene umgesetzt wird?
Ich habe ein Objekt bekommt, dass ein dict zum größten Teil (im Nachhinein zu sein vorgibt soll ich nur subclassed dict, aber ich würde lieber die Code-Basis nicht Refactoring, und ich würde dies auch gerne für Zukunft wissen Referenz), die etwas ein bisschen wie
siehtclass configThinger(object):
_config = {}
def __getitem__(self, key):
return self._config[key]
def __setitem__(self, key, value):
self._config[key] = value
Welche genau funktioniert, wie es sollte und korrekt verhält, wenn ich Zugriff versuchen, es Elemente wie configThingerInstance ist [ ‚unabhängig‘]
Aber ein Aufruf wie
t = configThinger()
t.populate() # Internal method that fills it with some useful data
if 'DEBUG' in t:
doStuff()
Ergebnisse in einem KeyError angehoben werden, weil vermutlich die `in' Protokoll hat eine getitem () Suche nach dem Schlüssel in Frage. Muss ich eine andere Ausnahme erhöhen in sagen, dass er nicht da ist? Ich möchte lieber nicht so etwas tun.
try:
t['DEBUG']
except KeyError:
pass
else:
doStuff()
Auch dort, wo in der Dokumentation ist das?
Ich war auf der Suche um
http://docs.python.org/tutorial/datastructures.html
http://docs.python.org/library/stdtypes.html
aber auf tragische Weise für etwas zu Google versucht, die spezifisch für das Wort ‚in‘ ist Torheit: (
EDIT 1:
Mit einem Stapel von Spuren drucken, kann ich sehen, dass das Programm ruft configThingerInstance. getitem (0)
aber
t = {'rawk': 1,
'rawr': 2,
}
t[0] # Raises KeyError
'thing' in t # returns False
Lösung
Es klingt wie Sie den Operator zu überlasten wollen?
können Sie tun, indem Sie die Methode __contains__
definieren: http: // docs .python.org / reference / datamodel.html # Objekt. enthält
Andere Tipps
Für die beste Unterstützung für den in
Operator (Containment aka Mitgliedschaft Prüfung), Umsetzung der __contains__
spezielle Methode auf Ihrer configThinger
Klasse:
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
hier (auch erklären, andere, weniger Möglichkeiten, den in
Operator).