编程语言
首页 > 编程语言> > 在Python 2.7.x中动态生成部分函数

在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