Python 闭包和函数属性

标签 python closures

我尝试重新实现类似 partial 的东西(稍后会有更多行为)。现在在下面的例子中 lazycall1 似乎和 lazycall2 一样工作,所以我不明白为什么 documentation of partial建议使用更长的第二个版本。有什么建议么?它会给我带来麻烦吗?

def lazycall1(func, *args, **kwargs):
    def f():
        func(*args, **kwargs)
    return f

def lazycall2(func, *args, **kwargs):
    def f():
        func(*args, **kwargs)
    f.func=func   # why do I need that?
    f.args=args
    f.kwargs=kwargs
    return f

def A(x):
    print("A", x)

def B(x):
    print("B", x)

a1=lazycall1(A, 1)
b1=lazycall1(B, 2)
a1()
b1()

a2=lazycall2(A, 3)
b2=lazycall2(B, 4)
a2()
b2()

编辑:实际上到目前为止给出的答案并不完全正确。即使有双重参数,它也会起作用。还有别的原因吗?

def lazycall(func, *args):
    def f(*args2):
        return func(*(args+args2))
    return f

def sum_up(a, b):
    return a+b

plusone=lazycall(sum_up, 1)
plustwo=lazycall(sum_up, 2)
print(plusone(6)) #7
print(plustwo(9)) #11

最佳答案

第二种形式唯一的额外内容是一些额外的属性。如果您开始传递 lazycall2 返回的函数,这可能会有所帮助,以便接收函数可以根据这些值做出决定。

关于Python 闭包和函数属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9018308/

相关文章:

python - The Foundry Nuke – 在 QLabel 上显示动画值

python - 将列表分块到大小 N 并添加到数据帧最终会丢失数据

ios - 如何在 Swift 中设置网络请求类

JavaScript "Not a function"

ios - 如何在 Swift 的完成处理程序中返回 bool 值

python - 使用 S3 子文件夹作为 Django 收集静态目标

python - pyqt4 在 Linux 中设置 QDateEdit 值

java - Groovy println then 从关闭中中断

Swift Closures - 将 self 捕捉为弱者

python - Django 导入 Excel 端点