Python: Как вы можете получить взаимный доступ к объекту или словарю? - PullRequest
4 голосов
/ 21 ноября 2010

Я пишу представление Django, которое иногда получает данные из базы данных, а иногда и из внешнего API.

Когда это происходит из базы данных, это экземпляр модели Django.Атрибуты должны быть доступны с точечной нотацией.

Исходя из API, данные являются словарем и доступны через нижнюю нотацию.

В любом случае некоторая обработка данных выполняется.

Я бы хотел избежать

if from_DB:
   item.image_url='http://example.com/{0}'.format(item.image_id)
else:
   item['image_url']='http://example.com/{0}'.format(item['image_id'])

Я пытаюсь найти более элегантный, СУХОЙ способ сделать это.

Есть ли способ получить / установитьпо ключу, который работает со словарями или объектами?

Ответы [ 3 ]

6 голосов
/ 21 ноября 2010

В JavaScript они эквивалентны (часто полезно; я упоминаю об этом, если вы не знали, как занимаетесь веб-разработкой), но в Python они отличаются - [items] против .attributes.

Легко написать что-то, что позволяет получить доступ через атрибуты, используя __getattr__:

class AttrDict(dict):
    def __getattr__(self, attr):
        return self[attr]

    def __setattr__(self, attr, value):
        self[attr] = value

Затем просто используйте его, как если бы вы использовали dict (он будет принимать dict в качестве параметра, поскольку он расширяет dict), но вы можете делать такие вещи, как item.image_url, и он будет сопоставьте его с item.image_url, получая или устанавливая.

6 голосов
/ 21 ноября 2010

Вы можете использовать класс Bunch , который преобразует словарь в нечто, принимающее точечные обозначения.

2 голосов
/ 21 ноября 2010

Я не знаю, каковы будут последствия, но я бы добавил метод к модели django, который считывает словарь в себя, чтобы вы могли получить доступ к данным через модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...