Я пишу власний контейнер, який повинен надати доступ до словника всередині за викликами атрибутів. Типове використання контейнера було б таким:
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"
Я не впевнений, чи є вкладені спроби / крім блоків хорошою практикою, тому іншим способом було б використання 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")
Або скористатися одним із них та одним блоком спробувати ловити так:
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")
Який варіант є найбільш пітонічним та елегантним?
if 'foo' in dict_container:. Амінь.