1

假设我们有两个脚本,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 的 print 语句test(x)成功告诉我我有一个Foo对象,但这对我来说没有意义,因为我只test从 script1 导入,而不是Foo. 我查看了eval文档,但这对我来说并没有太大的意义。Foo即使我从未导入过类,怎么可能创建一个对象Foo

4

1 回答 1

5

eval()使用执行它的模块的全局变量。test“生活”在script1全局命名空间中,因此任何执行的表达式都eval()使用与该函数相同的命名空间,因此可以解析Foo,bartest.

导入一个函数不会改变它的命名空间;全局变量 fortest不会仅仅通过调用 from 来改变script2。如果是这样,对于您想要使用的每个功能,需要将任何导入导入到script1中。那将是非常不切实际的。script2

你甚至可以看到你导入的函数的全局变量;print test.func_globals将向您显示script1.

于 2013-09-03T17:49:06.200 回答