Предположим, что у нас есть произвольный объект неизвестного типа, и мы хотим получить доступ к одинаково произвольному атрибуту, связанному с этим объектом, запрошенному как имя строки. Я ищу оптимальный подход для получения этого значения.Общий доступ к атрибутам для произвольных объектов во время выполнения
В псевдокоде/Python, текущая стратегия я рассматриваю вдоль этих линий:
def access_attribute(obj, attr):
if type(obj) == types.FunctionType:
return access_attribute(obj(), attr)
elif type(obj) == types.DictType:
return obj.get(attr)
# ... etc.
Пару пунктов, чтобы рассмотреть следующие вопросы:
- Что произойдет, если атрибут не существует на объект? Я в порядке поднимаю исключение.
- Атрибут может быть глубоко вложен.
Я полагаю, что это проблема, которая должна быть решена языками программирования и интерпретаторами DSL, но я не знаю стандартной/общепринятой передовой практики.
Идея передачи пользовательского хранимого DSL/кода на eval
во время выполнения вместе с объектом была поднята, но я хочу избежать этого конкретного решения и сейчас предпочитаю Pythonic.
Меня тоже интересует ответ на этот вопрос. Я столкнулся с несколькими случаями, когда возможность доступа к атрибутам через конфигурацию была бы полезной, но столкнулась с трудностями со многими типами в сложных иерархиях объектов ... – MaineCoder
Не уверен, что есть лучшая практика. Что касается существующих подходов, я работал с классом «Accessor» в django-tables2 ([code] (https://github.com/bradleyayers/django-tables2/blob/master/django_tables2/utils.py)) который выполняет довольно общий и вложенный поиск атрибутов по имени (атрибуты, dict-keys, list-indexes, методы 0-arg и т. д.). – schwobaseggl
@schwobaseggl спасибо за ссылку на django-tables2. Код Accessor определенно совпадает с аналогичными строками. Там могут быть очень хорошие идеи, чтобы заимствовать и размышлять. –