en protocolo con respecto a la secuencia
Pregunta
¿Cómo se implementa esto a nivel de Python?
Tengo un objeto que pretende ser un dict en su mayor parte (en retrospectiva, debería haber subclasificado dict, pero prefiero no refactorizar la base de código, y también me gustaría saber esto para el futuro referencia), que se parece un poco a
class configThinger(object):
_config = {}
def __getitem__(self, key):
return self._config[key]
def __setitem__(self, key, value):
self._config[key] = value
Que funciona exactamente como se supone y se comporta correctamente cuando intento acceder a sus elementos como configThingerInstance ['lo que sea']
Pero una llamada como
t = configThinger()
t.populate() # Internal method that fills it with some useful data
if 'DEBUG' in t:
doStuff()
da como resultado que se genere un KeyError porque presumiblemente el protocolo `in 'realiza una búsqueda de getitem () para la clave en cuestión. ¿Debo plantear alguna otra excepción para decir que no está allí? Prefiero no hacer algo como esto.
try:
t['DEBUG']
except KeyError:
pass
else:
doStuff()
Además, ¿en qué parte de la documentación está esto?
Estaba mirando alrededor
http://docs.python.org/tutorial/datastructures.html
http://docs.python.org/library/stdtypes.html
pero trágicamente intentar buscar en Google algo específico para la palabra 'en' es una locura :(
EDITAR 1:
Con una pila de huellas, puedo ver que el programa llama a configThingerInstance. getitem (0)
sin embargo
t = {'rawk': 1,
'rawr': 2,
}
t[0] # Raises KeyError
'thing' in t # returns False
Solución
¿Parece que quieres sobrecargar el operador in?
Puede hacerlo definiendo el método __contains__
: http://docs.python.org/reference/datamodel.html#object. contiene
Otros consejos
Para obtener el mejor soporte para el operador in
(contención, también conocida como verificación de membresía), implemente el método especial __contains__
en su clase 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
los documentos están aquí (también explicando otras formas menores de admitir el operador in
).