2013-05-04 61 views
4

我使用Jinja2作爲網站模板引擎,以及我作爲宏實現的模板中使用的所有helper函數,但僅限於一個。這是Python代碼:Jinja2中的Python lambdas

def arrow_class_from_deg(angle): 
    if angle is None: 
     return '' 
    arrow_directions = [ 
     (0, 'n'), (45, 'ne'), (90, 'e'), (135, 'se'), (180, 's'), 
     (225, 'sw'), (270, 'w'), (315, 'nw'), (360, 'n') 
    ] 
    return min(arrow_directions, key=lambda (ang, _): abs(ang - angle))[1] 

它返回最接近指定角度的箭頭的CSS類。這個函數只能在模板中使用,因此在模板中實現也是有意義的,也就是作爲一個宏。然而,試圖做到這一點,我注意到Jinja2似乎不支持Python lambda。這是真的,如果是的話,那麼如何寫這個函數更好(我希望這裏沒有必要循環)?

回答

2

註冊它作爲一個過濾器:

your_jinja_env.filters['arrow_class'] = arrow_class_from_deg 

和模板:

<something class="{{ angle | arrow_class }}">blah</something> 

你可以用裝飾來管理神社過濾器容易:

class Filter(object): 
    def __init__(self, filter_name=None): 
     self.filter_name = filter_name 

    def __call__(self, function): 
     my_jinja_env.filters[self.filter_name or function.__name__] = function 
     return function 

@Filter() 
def i_love_you(name): 
    ''' say I love you to the name you entered. 
    usage: {{ "John" | i_love_you }} => "I Love You, John!"''' 

    return "I Love You, %s!" %name 
+1

所以,這是不可能的在模板中實現? – aplavin 2013-05-05 09:03:06