gpt4 book ai didi

python - 内部函数未形成闭包

转载 作者:太空狗 更新时间:2023-10-30 02:53:08 25 4
gpt4 key购买 nike

这是一个带有局部函数的简单函数:

def raise_to(exp):
def raise_to_exp(x, exp):
return pow(x, exp)
return raise_to_exp

现在我希望本地函数在 exp 上关闭,但不知何故它没有。当我运行这个时:

square = raise_to(2)
print(square.__closure__)

我得到 None。我错过了什么?

最佳答案

没有闭包,没有,因为内部函数有它自己的 local exp 变量;你用那个名字给了它一个参数。该参数屏蔽了外部作用域中的名称,因此不会为其创建闭包。返回的函数需要两个 参数,raise_to() 的参数被忽略:

>>> from inspect import signature
>>> def raise_to(exp):
... def raise_to_exp(x, exp):
... return pow(x, exp)
... return raise_to_exp
...
>>> signature(raise_to(2))
<Signature (x, exp)>
>>> square = raise_to(2)
>>> square(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: raise_to_exp() missing 1 required positional argument: 'exp'
>>> square(5, 3)
125
>>> raise_to('This is ignored, really')(5, 3)
125

如果您希望从外部函数中获取参数,请从内部函数中删除 exp 参数:

def raise_to(exp):
def raise_to_exp(x):
return pow(x, exp)
return raise_to_exp

现在 exp 是一个闭包:

>>> def raise_to(exp):
... def raise_to_exp(x):
... return pow(x, exp)
... return raise_to_exp
...
>>> raise_to(2).__closure__
(<cell at 0x11041a978: int object at 0x10d908ae0>,)
>>> raise_to.__code__.co_cellvars
('exp',)

代码对象的 co_cellvars 属性为您提供了外部作用域中任何封闭变量的名称。

返回的函数接受一个参数,现在实际使用 raise_to() 的参数:

>>> raise_to(2)(5)
25
>>> raise_to('Incorrect type for pow()')(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in raise_to_exp
TypeError: unsupported operand type(s) for ** or pow(): 'int' and 'str'

关于python - 内部函数未形成闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50820398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com