4

假设我想从以下 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中运行它时,我得到:

AttributeError: 'functools.partial' object has no attribute '__module__'

有没有其他方法可以做到这一点,也许使用装饰器?

主题背景:

同样,我正在寻找的是另一种方法。

4

1 回答 1

4

嵌入式 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 外壳中为我工作:

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 在线 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
于 2014-06-02T19:39:40.910 回答