假设我想从以下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' object has no attribute '__module__'
有没有替代这样做的方式,也许是使用装饰器?
再次,我正在寻找的是替代这样做的方式。
答案 0 :(得分:4)
您可以使用闭包实现(我相信这可能是您的解决方案):
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