繁体   English   中英

Python闭包和函数属性

[英]Python closure and function attributes

我试图重新实现像partial一样的东西(后来会有更多的行为)。 现在在下面的例子中, lazycall1似乎和lazycall2一样lazycall2 ,所以我不明白为什么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返回的函数,这可能会有所帮助,以便接收函数可以根据这些值做出决策。

functools.partial可以在内部返回函数中接受其他参数 - 或重写参数。 你的内部f()函数没有,所以你不需要在lazycall2做什么。 但是,如果你想做这样的事情:

def sum(a, b):
    return a+b
plusone = lazycall3(sum, 1)
plusone(6) # 7

您需要执行这些文档中显示的内容。

仔细查看链接到的Python文档页面中内部函数newfunc中的参数名称,它们与传递给内部函数, argsfargskeywordsfkeywords 它们的partial实现保存了赋予外部函数的参数,并将它们添加到赋予内部函数的参数中。

由于在内部函数中重用了完全相同的参数名称,因此外部函数的原始参数将无法访问。

至于在外部函数上设置funcargskwargs属性,函数是Python中的对象,您可以在其上设置属性。 这些属性允许您在将它们传递到lazycall函数后访问原始函数和参数。 所以a1.func将是Aa1.args将是[1]

如果你不需要跟踪原始函数和参数,那么你的lazycall1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM