在Python 2.7中定义exec中的函数和类?

时间:2016-02-25 08:12:41

标签: python python-2.7 scope exec

您可以在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_2test_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

1 个答案:

答案 0 :(得分:0)

因为你的类(和函数)不在全局空间

演示:

>>> def test_2():
...     exec(my_class_fun)
...     global test_class_2
...     global test_func_2
...     test_func_2()
... 
>>> test_2()
a