从
exec()文档中:
请记住,在模块级别,全局变量和局部变量是相同的字典。如果
exec获取两个单独的对象作为 globals 和 locals
,则代码将像嵌入在类定义中一样执行。
您传入了两个单独的字典,但是尝试执行需要模块范围全局变量可用的代码。
import math在一个类中将产生一个 局部作用域属性
,并且您创建的函数将无法访问该 属性 ,因为函数闭包不考虑类作用域名称。
请参阅Python执行模型参考中的
命名和绑定 :
类定义块和参数
exec(),并eval()在名称解析的情况下特别。类定义是可以使用和定义名称的可执行语句。这些引用遵循通常的名称解析规则,但在全局命名空间中查找未绑定的局部变量。类定义的名称空间成为该类的属性字典。在类块中定义的名称范围仅限于该类块。它不会扩展到方法[。]的代码块
您可以通过尝试在类定义中执行代码来重现错误:
>>> class Demo:... import math... def func(x):... return math.sin(x)... func(10)...Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 5, in Demo File "<stdin>", line 4, in funcNameError: name 'math' is not defined
只需传递 一 本字典。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)