Почему в Python нет встроенного гибридного getattr + __getitem__?

У меня есть методы, которые принимают 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)

Дело в том, что довольно распространенный образец. Я видел этот или очень похожий на него метод во многих модулях. Так почему же чего-то подобного нет в ядре языка или хотя бы в одном из основных модулей? В противном случае существует ли окончательный способ, как это могло бы быть записано ?

9
задан CommonGuy 27 May 2015 в 13:01
поделиться