Estoy escribiendo mi propio contenedor, que necesita dar acceso a un diccionario dentro mediante llamadas de atributo. El uso típico del contenedor sería así:
dict_container = DictContainer()
dict_container['foo'] = bar
...
print dict_container.foo
Sé que podría ser estúpido escribir algo como esto, pero esa es la funcionalidad que necesito proporcionar. Estaba pensando en implementar esto de la siguiente manera:
def __getattribute__(self, item):
try:
return object.__getattribute__(item)
except AttributeError:
try:
return self.dict[item]
except KeyError:
print "The object doesn't have such attribute"
No estoy seguro de si los bloques try / except anidados son una buena práctica, por lo que otra forma sería usar hasattr()y has_key():
def __getattribute__(self, item):
if hasattr(self, item):
return object.__getattribute__(item)
else:
if self.dict.has_key(item):
return self.dict[item]
else:
raise AttributeError("some customised error")
O para usar uno de ellos y un bloque de captura como este:
def __getattribute__(self, item):
if hasattr(self, item):
return object.__getattribute__(item)
else:
try:
return self.dict[item]
except KeyError:
raise AttributeError("some customised error")
¿Qué opción es más pitónica y elegante?
if 'foo' in dict_container:. Amén.