2014-04-10 37 views
0

下面是我想要做的具體描述: 我想添加自定義過濾器到jinja2模板渲染引擎。要做到這一點,我需要引用功能,以使事情更通用添加到字典,像添加模塊功能自動爲字典

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()',但是我仍然必須在導入該函數的同時才能使用它。有人能告訴我如何實現這一目標嗎?

回答

3

你有幾個選擇。首先是採取什麼你有和使用getattr

{f: getattr(filters, f) for f in dir(filters) if not f.startswith('__')} 

但是,這或許可以變得更容易一些。模塊有一個__dict__屬性,你可以看看。例如: -

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