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

Edg*_*ian 1 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)
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

Mar*_*ers 5

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

导入函数不会改变其命名空间; 全局变量test不仅仅是通过被调用来改变script2.如果那样,在任何进口script1需要导入script2,为你曾经想使用每个功能.这将是非常不切实际的.

您甚至可以看到导入函数的全局变量; print test.func_globals将告诉你确切的命名空间script1.