Python import 语句是否也自动导入依赖项?

Kar*_*and 7 python function python-import

我有以下文件 app.py

class Baz():
    def __init__(self, num):
        self.a = num
        print self.a

def foo(num):
    obj = Baz(num)
Run Code Online (Sandbox Code Playgroud)

和第二个文件 main.py

from app import foo
foo(10)
Run Code Online (Sandbox Code Playgroud)

运行该文件python main.py会给出正确的输出。

现在在第二个文件中,我只是导入函数而不是类,尽管成功执行我的函数也需要类。

导入函数时,Python 会自动导入运行该函数所需的所有其他内容,还是会自动搜索当前目录中的类?

Ash*_*ary 7

正如 @DavidZ 已经提到的,当我们导入整个 Python 文件时,它就会被编译。但是当解析函数体时会发生另一个特殊的事情,函数知道它应该在局部范围内查找哪些变量以及应该在全局范围内查找哪些变量(当然也有自由变量)。

\n\n
>>> import dis\n>>> dis.dis(foo)\n  7           0 LOAD_GLOBAL              0 (Baz)\n              3 LOAD_FAST                0 (num)\n              6 CALL_FUNCTION            1\n              9 STORE_FAST               1 (obj)\n             12 LOAD_CONST               0 (None)\n             15 RETURN_VALUE\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,这里Baz必须从全局范围中获取。

\n\n
\n

但是,当我们在另一个文件中导入 app.py 时,如何识别这个全局范围呢?

\n
\n\n

好吧,每个函数都有一个__globals__附加的特殊属性,其中包含其实际的全局命名空间。因此,这就是以下的来源Baz

\n\n
>>> foo.__globals__[\'Baz\']\n<class __main__.Baz at 0x10f6e1c80>\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,应用程序的模块字典和foo.__globals__指向同一个对象:

\n\n
>>>sys.modules[\'app\'].__dict__ is foo.__globals__ \nTrue\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,即使您在导入后定义另一个名为Bazin的变量,它仍然会访问实际的.main.pyfooBaz

\n\n

数据模型页面

\n\n

__globals__ func_globals:

\n\n
\n

对保存函数\xe2\x80\x99s 全局\n 变量的字典的引用\xe2\x80\x94定义函数\n 的模块的全局命名空间。

\n
\n