在Python 2.7.x中动态生成部分函数
作者:互联网
假设我想从以下lambda动态创建IPython shell上的函数:
f = lambda x, ci: np.percentile(x, 100-ci)
将ci修复为新值.它将类似于以下内容(create_new_f是我正在寻找的).
ci = 20
new_f = create_new_f(f, ci=ci)
result = new_f([20,30,50,80])
我尝试过使用functools.partial:
new_f = functools.partial(f, ci=20)
但是当我在IPython的嵌入式shell中run this时,我得到:
AttributeError:’functools.partial’对象没有属性’__module__’
有没有其他方法可以做到这一点,也许使用装饰器?
关于这个主题的背景:
>这是一个提示问题的IPython issue.
>这里是一个线程explaining the problem(并且仅在Python 3.x中修复).
>这是another thread在SO中显示问题(参见顶部评论)
>有关此问题的更深入分析,请参阅IPython中的this issue.
再一次,我正在寻找的是另一种方法.
解决方法:
嵌入式IPython的解决方案,
您可以使用闭包实现(我相信这可能是您的解决方案):
import numpy as np
def partial_f(ci):
def fn(x):
return np.percentile(x, 100-ci)
return fn
new_f = partial_f(20)
new_f([20,30,50,80])
回报
62.000000000000014
去检查:
functools.partial在我工作的IDE shell中为我工作:
import functools
import numpy as np
f = lambda x, ci: np.percentile(x, 100-ci)
ci = 20
new_f = functools.partial(f, ci=ci)
new_f([20,30,50,80])
回报
62.000000000000014
使用lambdas(这确实在IPython online shell中工作,我尝试了它,但显然不适合你的情况):
import numpy as np
pf = lambda ci: lambda x: np.percentile(x, 100-ci)
new_f2 = pf(20)
new_f2([20,30,50,80])
也回来了
62.000000000000014
标签:python,closures,embedded,ipython,partial-application 来源: https://codeday.me/bug/20190624/1278608.html