У меня есть методы, которые принимают dicts или другие объекты и имена «полей» для выборки из этих объектов. Если объект является dict, тогда метод использует __ getitem __
для получения именованного ключа, иначе он использует getattr
для получения именованного атрибута. Это довольно часто встречается в языках веб-шаблонов. Например, в шаблоне Chameleon у вас может быть:
Stuff goes here
Если вы передадите foo
в виде словаря типа {'keyname': 'bar'}
, затем foo.keyname
выбирает ключ 'keyname' для получения 'bar'. Если foo
является экземпляром класса, например:
class Foo(object):
keyname = 'baz'
, тогда foo.keyname
извлекает значение из атрибута keyname
. Сам Chameleon реализует эту функцию (в модуле chameleon.py26
) следующим образом:
def lookup_attr(obj, key):
try:
return getattr(obj, key)
except AttributeError as exc:
try:
get = obj.__getitem__
except AttributeError:
raise exc
try:
return get(key)
except KeyError:
raise exc
Я реализовал ее в моем собственном пакете , например:
try:
value = obj[attribute]
except (KeyError, TypeError):
value = getattr(obj, attribute)
Дело в том, что довольно распространенный образец. Я видел этот или очень похожий на него метод во многих модулях. Так почему же чего-то подобного нет в ядре языка или хотя бы в одном из основных модулей? В противном случае существует ли окончательный способ, как это могло бы быть записано ?