2017-01-10 3 views
5

Предположим, что у нас есть произвольный объект неизвестного типа, и мы хотим получить доступ к одинаково произвольному атрибуту, связанному с этим объектом, запрошенному как имя строки. Я ищу оптимальный подход для получения этого значения.Общий доступ к атрибутам для произвольных объектов во время выполнения

В псевдокоде/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.

+0

Меня тоже интересует ответ на этот вопрос. Я столкнулся с несколькими случаями, когда возможность доступа к атрибутам через конфигурацию была бы полезной, но столкнулась с трудностями со многими типами в сложных иерархиях объектов ... – MaineCoder

+2

Не уверен, что есть лучшая практика. Что касается существующих подходов, я работал с классом «Accessor» в django-tables2 ([code] (https://github.com/bradleyayers/django-tables2/blob/master/django_tables2/utils.py)) который выполняет довольно общий и вложенный поиск атрибутов по имени (атрибуты, dict-keys, list-indexes, методы 0-arg и т. д.). – schwobaseggl

+0

@schwobaseggl спасибо за ссылку на django-tables2. Код Accessor определенно совпадает с аналогичными строками. Там могут быть очень хорошие идеи, чтобы заимствовать и размышлять. –

ответ

-1

getattr(object, name[, default]), кажется, ответить хотя бы первую половину вашего вопроса, и этот момент:

Что произойдет, если атрибут не существует на объекте? Я в порядке поднимаю исключение.

Я бы сказал, что это лучшая практика, поскольку это часть стандартной библиотеки.

Что касается вашего второго пункта:

Атрибут может быть глубоко вложенными.

Решение будет использовать dir(object) (которые будут перечислены все атрибуты объекта) и цикл над теми, для объектов, не Dict, но я менее уверен в «лучшей практики» аспект этого решение.

+0

Я думаю, что это напрямую игнорирует вопрос о различных типах доступа, которые будут использоваться, и о том, как наилучшим образом определить, как перемещаться по объектной структуре. – MaineCoder

Смежные вопросы