Я пишу свой собственный контейнер, который должен предоставлять доступ к словарю внутри с помощью вызовов атрибутов. Типичное использование контейнера будет выглядеть так:
dict_container = DictContainer()
dict_container['foo'] = bar
...
print dict_container.foo
Я знаю, что было бы глупо писать что-то подобное, но эту функциональность мне нужно предоставить. Я думал о реализации этого следующим образом:
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"
Я не уверен, являются ли вложенные блоки try/кроме хорошей практикой, поэтому другим способом было бы использовать hasattr()
и 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")
Или использовать один из них и один блок catch типа try:
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")
Какой вариант является наиболее питонным и элегантным?