python 中的导入行为

Behavior of import in python

假设 python 模块计算一次是否安全? 如果module A包含CONST_A = json.load(...),在同一个程序不同线程的不同文件中多次导入,会不会是calculated/executed就一次? 如果不是,什么时候CONST_A被重新计算?下一个结构会修复它吗?

module CALCULATE_CONST_A
    import json
    CONST_A = json.load(open(...))

module A
    from CALCULATE_CONST_A import CONST_A

further imports of A...

最后一个问题:创建预计算常量的最佳做法是什么?

好吧,让我们来做个实验:

tbi.py

print("Hello, World!")

file1.py

import tbi
print("This is file1")

file2.py

import file1
import tbi
print("This is file2")

现在,当我们 运行 file2 时,我们看到:

$ python file2.py
Hello, World!
This is file1
This is file2

所以你的问题的答案是是的,python模块只执行一次。如果 tbi.py 被执行了两次,我们就会看到 "Hello World" 被打印了两次。那么,可以得出结论,文件的属性是在第一次导入该文件时设置的

此外,更多的实验可以告诉你,如果我把一个全局变量放在 tbi 中,并且 file1file2 都修改了它,他们都会修改相同的目的。这在许多 built-in 包中可见:例如,更改 sys.stdout 的值(标准输出的文件描述符,以及首次加载 sys 模块时指定的全局变量) 为 整个程序 更改它,而不仅仅是修改它的文件。


如果您担心这种情况会导致错误,最好的办法是不要使用全局变量 - 相反,请使用 类 并在构造时为它们分配默认值。