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
中,并且 file1
和 file2
都修改了它,他们都会修改相同的目的。这在许多 built-in 包中可见:例如,更改 sys.stdout
的值(标准输出的文件描述符,以及首次加载 sys
模块时指定的全局变量) 为 整个程序 更改它,而不仅仅是修改它的文件。
如果您担心这种情况会导致错误,最好的办法是不要使用全局变量 - 相反,请使用 类 并在构造时为它们分配默认值。
假设 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
中,并且 file1
和 file2
都修改了它,他们都会修改相同的目的。这在许多 built-in 包中可见:例如,更改 sys.stdout
的值(标准输出的文件描述符,以及首次加载 sys
模块时指定的全局变量) 为 整个程序 更改它,而不仅仅是修改它的文件。
如果您担心这种情况会导致错误,最好的办法是不要使用全局变量 - 相反,请使用 类 并在构造时为它们分配默认值。