以下是我要做的具体描述: 我想为jinja2模板渲染引擎添加自定义过滤器。为此,我需要将函数的引用添加到dict,比如
def my_filter(foo):
do_stuff
return bar
templateEnv.filters['my_filter'] = my_filter
现在为了使事情变得更通用,我希望将所有自定义过滤器放在一个文件中(filters.py)并自动将所有这些函数添加到我的过滤器字典中。像这个天真的实现:
import filters
for f in all_function_refs_in(filters):
templateEnv.filters[f.name] = f
我能得到的是我要添加的所有名称的列表:
[f for f in dir(filters) if not f.startswith('__')]
但这只是名称,而不是我想要添加的函数的引用。有没有办法将字符串转换回函数引用?我可以使用'eval()',但是我仍然必须将它与导入函数一起使用。有人可以告诉我如何实现这一目标吗?
答案 0 :(得分:3)
您有几个选择。首先是拿走你拥有的东西并使用getattr
:
{f: getattr(filters, f) for f in dir(filters) if not f.startswith('__')}
但是,这可能会更容易一些。模块具有__dict__
属性,您可以查看。 e.g:
print filters.__dict__
您可以更轻松地过滤该词典:
{name: func for name, func in filters.__dict__.items() if not name.startswith('__')}
最后,您可以使用inspect
:
import inspect
{name: func
for name, func in inspect.getmembers(filters, inspect.isfunction)
if not name.startswith('__')}