将模块功能自动添加到dict中

时间:2014-04-10 06:44:42

标签: python dictionary reference module

以下是我要做的具体描述: 我想为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()',但是我仍然必须将它与导入函数一起使用。有人可以告诉我如何实现这一目标吗?

1 个答案:

答案 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('__')}