Как использовать dicts в шаблонах Mako? - PullRequest
2 голосов
/ 28 февраля 2010

Всякий раз, когда я передаю сложную структуру данных в Мако, сложно повторить ее. Например, я передаю диктант списка, и для доступа к нему в Мако мне нужно сделать что-то вроде:

% for item in dict1['dict2']['list']: ... %endfor

Мне интересно, есть ли у Мако какой-нибудь механизм, который мог бы заменить использование [] для доступа к элементам словаря простым .?

Тогда я мог бы написать строку выше как:

% for item in dict1.dict2.list: ... %endfor

Что гораздо приятнее, не так ли?

Спасибо, Бода Кидо.

Ответы [ 2 ]

8 голосов
/ 28 февраля 2010

Упрощение примера Лукаша:

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/

3 голосов
/ 28 февраля 2010
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. К сожалению, Мако не предоставляет никаких хуков, чтобы сделать это автоматически.

...