对进口和逃避感到困惑 - Python

时间:2013-09-03 17:47:56

标签: python

假设我们有两个脚本,script1和script2。

script1定义为:

class Foo(object):
    def __init__(self, name):
        self.name = name

class bar(object):
    def __init__(self, name):
        self.name = name

def test(givenString):
    return eval(givenString)

和script2定义为:

from .script1 import test

x = "Foo('me')"
print test(x)

script2的test(x)的print语句成功告诉我,我有一个Foo对象,但这对我没有意义,因为我只从script1导入test,而不是{{ 1}}。我查看了Foo文档,但这对我来说并不是很清楚。即使我从未导入类eval,如何创建Foo对象?

1 个答案:

答案 0 :(得分:5)

eval()使用它执行的模块的全局变量。test'生命'在script1全局命名空间中,因此eval()执行的任何表达式都使用相同的名称空间作为该函数,因此可以解析Foobartest

导入函数不会改变其命名空间; test的全局变量不会仅仅通过从script2调用而改变。如果是这样,script1中的任何导入 都需要导入script2,以用于您想要使用的每个功能。那将是非常不切实际的。

您甚至可以看到导入函数的全局变量; print test.func_globals会向您显示script1的确切命名空间。