2015-10-22 89 views
0

我努力尋找一種能夠複製函數,重命名並應用參數的解決方案。一個例子是多個解說模塊中的重複函數和更改默認參數

我有一個模塊:

get(a, c=4, ver=False): 
    ... 

set(a, b, c=4, ver=False): 
    ... 

,並希望創造相應的功能所有這些功能如果用手工

ver_get(*args, **kwargs): 
    kwargs['ver'] = True 
    return get(*args, **kwargs) 

ver_set(*args, **kwargs): 
    kwargs['ver'] = True 
    return set(*args, **kwargs) 

我做已經嘗試了for循環遍歷所有的函數,但由於f的後期綁定問題而失敗(參見下文)。由於使用了* args,** kwargs,我無法將提供函數f作爲輸入的正常解決方法。

funcs = {} 
g = None 
f = None 
for g, f in globals().iteritems(): 
    funcs['ver_'+g] = lambda *args, **kwargs: f(*args, **dict(kwargs, ver=True)) 

此後funcs也需要包含在全局變量中。

爲什麼我要這樣做?只需要更好的語法而不需要手動複製函數。

回答

0

我試圖找到一個答案更早但失敗,然後突然間我絆倒了它。使用部分。完整的解決方案:

funcs = {} 
g = None 
f = None 
from functools import partial 
for g, f in globals().iteritems(): 
    if hasattr(f, '__call__'): 
     funcs['ver_'+g] = partial(f, ver=True) 
globals().update(funcs) 
del funcs 
del g 
del f