Я пишу свой собственный контейнер, который должен предоставлять доступ к словарю внутри с помощью вызовов атрибутов. Типичное использование контейнера будет таким:
dict_container = DictContainer() dict_container["foo"] = bar ... print dict_container.foo
Я знаю, что писать что-то подобное может быть глупо, но мне нужно предоставить именно эту функциональность. Я думал реализовать это следующим образом:
def __getattribute__(self, item): try: return object.__getattribute__(item), кроме AttributeError: try: return self.dict[item] кроме KeyError: print "У объекта нет такого атрибута"
Я не уверен, что вложенные блоки try/except являются хорошей практикой, поэтому другим способом будет использование hasattr()
и has_key()
:
def __getattribute__(self, item): если hasattr(self, item): вернуть объект. __getattribute__(item) else: if self.dict.has_key(item): return self.dict[item] else: поднять AttributeError("некоторая настроенная ошибка")
Или использовать один из них и один блок try catch следующим образом:
def __getattribute__(self, item): if hasattr(self, item): return object.__getattribute__(item) else: try: return self. dict[item] кроме KeyError: поднять AttributeError("какая-то пользовательская ошибка")
Какой вариант больше P изящно и элегантно?