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
¿Fue útil?

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 ).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top