Python 将模块自动添加到dict中

Python 将模块自动添加到dict中,python,dictionary,reference,module,Python,Dictionary,Reference,Module,以下是我尝试做的具体描述: 我想向jinja2模板渲染引擎添加自定义过滤器。为此,我需要在dict中添加对函数的引用,如 def my_filter(foo): do_stuff return bar templateEnv.filters['my_filter'] = my_filter 现在,为了使事情更加通用,我希望将所有自定义筛选器放在一个文件(filters.py)中,并自动将所有这些函数添加到我的筛选器目录中。类似于以下简单实现: import filters f

以下是我尝试做的具体描述: 我想向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()”,但我仍然需要在导入函数时将其结合起来。有人能告诉我这是如何完成的吗?

你有几个选择。第一种方法是获取您所拥有的并使用
getattr

{f: getattr(filters, f) for f in dir(filters) if not f.startswith('__')}
但是,这可能会容易一点。模块有一个
\uuuu dict\uuuu
属性,您可以查看该属性。e、 g:

print filters.__dict__
您可以更轻松地筛选该词典:

{name: func for name, func in filters.__dict__.items() if not name.startswith('__')}
最后,您可以使用
检查

import inspect
{name: func 
 for name, func in inspect.getmembers(filters, inspect.isfunction)
 if not name.startswith('__')}

你有几个选择。第一种方法是获取您所拥有的并使用
getattr

{f: getattr(filters, f) for f in dir(filters) if not f.startswith('__')}
但是,这可能会容易一点。模块有一个
\uuuu dict\uuuu
属性,您可以查看该属性。e、 g:

print filters.__dict__
您可以更轻松地筛选该词典:

{name: func for name, func in filters.__dict__.items() if not name.startswith('__')}
最后,您可以使用
检查

import inspect
{name: func 
 for name, func in inspect.getmembers(filters, inspect.isfunction)
 if not name.startswith('__')}

你有几个选择。第一种方法是获取您所拥有的并使用
getattr

{f: getattr(filters, f) for f in dir(filters) if not f.startswith('__')}
但是,这可能会容易一点。模块有一个
\uuuu dict\uuuu
属性,您可以查看该属性。e、 g:

print filters.__dict__
您可以更轻松地筛选该词典:

{name: func for name, func in filters.__dict__.items() if not name.startswith('__')}
最后,您可以使用
检查

import inspect
{name: func 
 for name, func in inspect.getmembers(filters, inspect.isfunction)
 if not name.startswith('__')}

你有几个选择。第一种方法是获取您所拥有的并使用
getattr

{f: getattr(filters, f) for f in dir(filters) if not f.startswith('__')}
但是,这可能会容易一点。模块有一个
\uuuu dict\uuuu
属性,您可以查看该属性。e、 g:

print filters.__dict__
您可以更轻松地筛选该词典:

{name: func for name, func in filters.__dict__.items() if not name.startswith('__')}
最后,您可以使用
检查

import inspect
{name: func 
 for name, func in inspect.getmembers(filters, inspect.isfunction)
 if not name.startswith('__')}