Python中exec()作用域问题解决方案
发布日期:2021-06-29 19:56:48
浏览次数:2
分类:技术文章
本文共 943 字,大约阅读时间需要 3 分钟。
首先,看一个使用exec的简单的例子:
content = """class Tool: def __str__(self): return "Hello""""if __name__ == "__main__": exec(content) print(Tool())
这个例子正常地返回了"Hello"的结果。
但是,当我们在函数或类中运行exec函数后,就会报错。例如以下两种情况。
def f(): exec(content) print(Tool())
class T: def __init__(self): exec(content) print(Tool())
报错信息为未找到Tool类:
NameError: name 'Tool' is not defined
参考文档如下:
exec(object[, globals[, locals]])
……如果省略了可选项,代码将在当前作用域内执行。 如果只提供了 globals,则它必须是一个字典(不能是字典的子类),该字典将同时被用于全局和局部变量。 如果同时提供了 globals 和 locals,它们会分别被用于全局和局部变量。……
注解:内置 和 函数各自返回当前的全局和本地字典,因此可以将它们传递给 的第二个和第三个实参。……
猜测可能是因为exec的默认作用域是当前作用域。通过locals()也可以看到Tool类确实存在于locals字典中。
{ 'self': <__main__.T object at 0x000001CFBA267730>, 'Tool':} # T对象{ 'Tool': } # f函数
由此,我们可以通过如下方式使exec在全局范围内运行,解决这个问题。
class T: def __init__(self): exec(content,globals()) print(Tool())
def f(): exec(content,globals()) print(Tool())
转载地址:https://dataartist.blog.csdn.net/article/details/107353950 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年04月08日 09时55分15秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
eslint warnings 与 error
2019-04-30
eslint - for-direction 循环
2019-04-30
eslint - getter-return
2019-04-30
css ===== text-transform
2019-04-30
javascript - 数据处理
2019-04-30
css ===== text-decoration
2019-04-30
css ===== white-space
2019-04-30
uniApp - 商城项目 - 1 项目搭建
2019-04-30
uniApp - 商城项目 2 - 底部导航
2019-04-30
CentOS7增加或修改SSH端口号
2019-04-30
Android回弹阻尼效果的简单实现,非基于ListView,ScrollView
2019-04-30
CentOS7部署轻量级web服务器nginx+php
2019-04-30
Android Studio爬过的坑
2019-04-30
Android签名生成和Android签名格式转换工具(MD5和SHA1签名)
2019-04-30
玩转Android Studio自定义模板插件-MVP模板为例
2019-04-30
reactNative 加载图片
2019-04-30
HTTP response报文结构
2019-04-30
css sprite是什么、有什么优缺点
2019-04-30
清除浮动的⼏种⽅式
2019-04-30