Estou escrevendo meu próprio contêiner, que precisa dar acesso a um dicionário dentro por chamadas de atributo. O uso típico do contêiner seria assim:
dict_container = DictContainer()
dict_container['foo'] = bar
...
print dict_container.foo
Sei que pode ser estúpido escrever algo assim, mas essa é a funcionalidade que preciso fornecer. Eu estava pensando em implementar isso da seguinte maneira:
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"
Não tenho certeza se os blocos try / except aninhados são uma boa prática; portanto, outra maneira seria usar hasattr()
e 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")
Ou, para usar um deles e tentar um bloco 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")
Qual opção é mais pitônica e elegante?
if 'foo' in dict_container:
. Amém.