python – 没有形成内部函数的闭包
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 没有形成内部函数的闭包,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1632字,纯文字阅读大概需要3分钟。
内容图文
![python – 没有形成内部函数的闭包](/upload/InfoBanner/zyjiaocheng/797/5ce4d55e60684dfea243bf0d08ed0f90.jpg)
这是一个带有本地函数的简单函数:
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__)
我没有.我错过了什么?
解决方法:
没有闭包,没有,因为内部函数有自己的本地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 – 没有形成内部函数的闭包全部内容,希望文章能够帮你解决python – 没有形成内部函数的闭包所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。