对Python的导入和评估感到困惑吗

2024-03-29 09:46:23 发布

您现在位置: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)

脚本2定义为:

from .script1 import test

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

script2对test(x)的print语句成功地告诉我有一个Foo对象,但这对我来说没有意义,因为我只从script1导入了test,而不是Foo。我查看了eval文档,但这对我来说并不清楚。即使我从未导入类Foo,怎么可能会创建一个Foo对象呢?你知道吗


Tags: nametestself脚本定义objectfooinit
1条回答
网友
1楼 · 发布于 2024-03-29 09:46:23

eval()使用在其中执行的模块的全局变量。test'存在于script1全局命名空间中,因此eval()执行的任何表达式都使用与该函数相同的命名空间,因此可以解析Foobartest。你知道吗

导入函数不会改变其名称空间;test的全局变量不会仅仅通过从script2调用而改变。如果是这样的话,script1中的任何导入都将需要导入到script2,用于您想要使用的每个函数。那将是难以置信的不切实际。你知道吗

您甚至可以看到您导入的函数的globals;print test.func_globals将显示script1的确切名称空间。你知道吗

相关问题 更多 >