假设我们有两个脚本,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)
Run Code Online (Sandbox Code Playgroud)
和script2定义为:
from .script1 import test
x = "Foo('me')"
print test(x)
Run Code Online (Sandbox Code Playgroud)
script2的print语句test(x)成功告诉我我有一个Foo对象,但这对我没有意义,因为我只test从script1 导入,而不是Foo.我查看了eval文档,但这对我来说并不是很清楚.这怎么可能是一个Foo即使我从来没有导入的类对象被创建Foo?
eval()使用它执行的模块的全局变量.test'生活'在script1全局命名空间中,因此任何执行的表达式都eval()使用与该函数相同的命名空间,因此可以解析Foo,bar和test.
导入函数不会改变其命名空间; 全局变量test不仅仅是通过被调用来改变script2.如果那样,在任何进口script1将还需要导入script2,为你曾经想使用每个功能.这将是非常不切实际的.
您甚至可以看到导入函数的全局变量; print test.func_globals将告诉你确切的命名空间script1.
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |