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,则它必须是一个字典(不能是字典的子类),该字典将同时被用于全局和局部变量。 如果同时提供了 globalslocals,它们会分别被用于全局和局部变量。……

注解:内置 和 函数各自返回当前的全局和本地字典,因此可以将它们传递给 的第二个和第三个实参。……

猜测可能是因为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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:LeetCode题解(1137):二叉树中的列表(Python)
下一篇:LeetCode题解(1171):从链表中删去总和值为零的连续节点(Python)

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月08日 09时55分15秒