Python3:'functools.partial'的内部语法之谜



在Python 3.x官方文档中,我们可以在下面找到关于functools.partial的源代码:

def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*args, *fargs, **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc

但是,我无法理解下面的语法

newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords

在哪里可以看到这些类似的语法?我很困惑。因为,当我尝试以下代码时,我遇到了致命错误:

def func(A, B):
def func_m(*fargs, **fkargs):
print(D+C)
print(fargs, fkargs)
func_m.D = A
func_m.C = B
return func_m
f = func(1, 2)
f()

但是我得到了一个NameError,在我打电话后没有定义名称"D"f().

请节省我的时间! 谢谢。

partial的代码不会导致NameError而你的代码会导致的原因是:

def newfunc块内部使用的argskeywords不是在该块外部newfunc上设置的属性,而是传递给partial本身的同名参数。

调用者可以访问在newfunc上设置的属性,以查看该函数上已经设置了哪些参数/kwarg,但是如果您将它们从partial的逻辑中删除,它仍然会正常工作(尝试:)

(

这些行用于存储有时便于检查的属性。它们不会影响newfunc体运行时会发生什么。在您的情况下,您可以这样做:

def func(A, B):
def func_m(*fargs, **fkargs):
print(A+B)
print(fargs, fkargs)
return func_m
f = func(1, 2)
f()

最新更新