假设我们有两个脚本,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
对象?
答案 0 :(得分:5)
eval()
使用它执行的模块的全局变量。test
'生命'在script1
全局命名空间中,因此eval()
执行的任何表达式都使用相同的名称空间作为该函数,因此可以解析Foo
,bar
和test
。
导入函数不会改变其命名空间; test
的全局变量不会仅仅通过从script2
调用而改变。如果是这样,script1
中的任何导入 都需要导入script2
,以用于您想要使用的每个功能。那将是非常不切实际的。
您甚至可以看到导入函数的全局变量; print test.func_globals
会向您显示script1
的确切命名空间。