gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:00:25 25 4
gpt4 key购买 nike

我有以下文件 app.py

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

def foo(num):
obj = Baz(num)

和第二个文件main.py

from app import foo
foo(10)

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

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

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

最佳答案

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

>>> import dis
>>> dis.dis(foo)
7 0 LOAD_GLOBAL 0 (Baz)
3 LOAD_FAST 0 (num)
6 CALL_FUNCTION 1
9 STORE_FAST 1 (obj)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE

所以,这里的 Baz 必须从全局范围获取。

But how to identify this global scope when we import app.py in another file?

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

>>> foo.__globals__['Baz']
<class __main__.Baz at 0x10f6e1c80>

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

>>>sys.modules['app'].__dict__ is foo.__globals__ 
True

因此,即使您在导入 foo 后在 main.py 中定义了另一个名为 Baz 的变量,它仍然会访问实际的 巴兹

来自 data-model page :

__globals__ func_globals:

A reference to the dictionary that holds the function’s global variables — the global namespace of the module in which the function was defined.

关于python - Python import 语句是否也自动导入依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29367255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com