Как использовать dicts в шаблонах Мако?
Всякий раз, когда я передаю сложную структуру данных Мако, трудно ее повторить. Например, я передаю диктовку списка dict, и для доступа к нему в Mako мне нужно сделать что-то вроде:
% for item in dict1['dict2']['list']: ... %endfor
Мне интересно, есть ли у Мако какой-то механизм, который мог бы заменить использование []
для доступа к элементам словаря с простым .
?
Тогда я мог бы написать строку выше:
% for item in dict1.dict2.list: ... %endfor
Что гораздо приятнее, не правда ли?
Спасибо, Бода Сидо.
Ответы
Ответ 1
class Bunch(dict):
def __init__(self, d):
dict.__init__(self, d)
self.__dict__.update(d)
def to_bunch(d):
r = {}
for k, v in d.items():
if isinstance(v, dict):
v = to_bunch(v)
r[k] = v
return Bunch(r)
Передайте функцию dict1 в to_bunch
перед тем, как передать ее в шаблон Мако. К сожалению, Mako не предоставляет никаких крючков, чтобы сделать это автоматически.
Ответ 2
Упрощение примера Łukasz:
class Bunch:
def __init__(self, d):
for k, v in d.items():
if isinstance(v, dict):
v = Bunch(v)
self.__dict__[k] = v
print Bunch({'a':1, 'b':{'foo':2}}).b.foo
Смотрите также: http://code.activestate.com/recipes/52308-the-simple-but-handy-collector-of-a-bunch-of-named/