首页 > 解决方案 > python中的导入行为

问题描述

假设 python 模块计算一次是否安全?如果在同一个程序和不同线程的不同文件中多次module A包含并导入,会不会只计算/执行一次?CONST_A = json.load(...)如果没有,什么时候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...

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

标签: pythonpython-3.xpython-import

解决方案


好吧,让我们进行实验:

tbi.py

print("Hello, World!")

文件1.py

import tbi
print("This is file1")

文件2.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修改它,它们都将修改同一个对象。这在许多内置包中是可见的:例如,更改sys.stdout(标准输出的文件描述符和sys模块首次加载时指定的全局变量)的值会更改整个程序,而不仅仅是文件修改它。


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


推荐阅读