Python 将模块自动添加到dict中
以下是我尝试做的具体描述: 我想向jinja2模板渲染引擎添加自定义过滤器。为此,我需要在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
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('__')}