在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
块内部使用的args
和keywords
不是在该块外部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()