您可以在exec&#d;代码中定义类和函数而不会出现问题:
my_func = """
def test_func():
print "Hi from test_func!"
"""
my_class = """
class test_class:
def __init__(self):
self.a = "a"
"""
def call_func():
exec(my_func)
test_func()
def call_class():
exec(my_class)
a = test_class()
>>> call_func()
Hi from test_func!
>>> call_class()
a
但是,在exec&#d; code中定义一个类和一个使用该类的函数会产生NameError
,因为该类不会在正确的范围内结束:
my_class_fun = """
class test_class_2:
def __init__(self):
self.a = "a"
def test_func_2():
a = test_class_2()
print(a.a)
"""
def test_2():
exec(my_class_fun)
test_func_2()
>>> test_2()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in test_2
File "<string>", line 7, in test_func_2
NameError: global name 'test_class_2' is not defined
将globals()
作为第二个参数传递给exec
,以便所有内容都以全局命名空间结束,解决了这个问题。
我的问题是,为什么这有必要? test_class_2
和test_func_2
似乎都应该是test_2
的本地人,那么为什么test_func_2
无法访问test_class_2
?
编辑:
从根本上说,我的问题是为什么test_2()
与此代码之类的内容不同,哪种方式正常:
def test_func():
class test_class:
def __init__(self):
self.a = "a"
def test_func_inner():
c = test_class()
print(c.a)
test_func_inner()
>>> test_func()
a
答案 0 :(得分:0)
因为你的类(和函数)不在全局空间
演示:
>>> def test_2():
... exec(my_class_fun)
... global test_class_2
... global test_func_2
... test_func_2()
...
>>> test_2()
a