我努力寻找能够复制函数,重命名并应用参数的解决方案。一个例子是更具说明性的
我有一个模块:
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 :(得分: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