我使用Jinja2作为网站模板引擎,并且模板中使用的所有辅助函数我已经实现为宏,但是用于一个。这是它的Python代码:
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 lambdas。是真的,如果是,那么如何更好地编写这个函数(我希望这里不需要循环)?
答案 0 :(得分:2)
将其注册为过滤器:
your_jinja_env.filters['arrow_class'] = arrow_class_from_deg
并在模板中:
<something class="{{ angle | arrow_class }}">blah</something>
您可以使用装饰器轻松管理jinja过滤器:
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