我正在用 python 编写一个包,它使用不同的库(numpy、numexp、pyfftw)执行许多数组操作。它由多个实用程序脚本和一个解析 .ini 文件并运行特定模拟的模拟脚本组成。我想选择对给定模拟运行的所有计算强制执行的精度(在 .ini 文件中)。
我想知道是否可以按照以下逻辑实现它(代码不起作用):
#config.py
DTYPE = 'float64'
#utility.py
import numpy as np
from config import DTYPE
def create_array():
print(DTYPE)
arr = np.ones(10, dtype=DTYPE)
return arr
#simulation.py
from config import DTYPE
from utility import create_array
if __name__ == '__main__':
print(DTYPE)
precision = get_precision(ini_file)
DTYPE = precision
create_array()
如果精度是“float32”,我希望看到以下输出:
'float64'
'float32'
我见过[这个问题](https://github.com/numpy/numpy/issues/6860)。这是一个很好的解决方法,但由于我使用了多个库,猴子修补(
np.array -> np.array(..., dtype=DTYPE)
)似乎并不理想,我想改变模拟之间的精度。
我知道我的代码不起作用,因为常量
DTYPE
在导入时加载并在运行时修改。
问题是
from config import DTYPE
的行为与您期望的不同:它没有为您提供指向 DTYPE
中的 config.py
变量的指针,它实际上是创建它的副本。所以 DTYPE
in config.py
、in utility.py
和 in simulation.py
是三个独立的变量,改变其中一个不会影响其他变量。
但是,如果您导入该模块,那么它会按照您想要的方式运行:
simulation.py
:
from config import DTYPE
from utility import create_array
import utility
if __name__ == '__main__':
print(DTYPE)
precision = get_precision(ini_file)
utility.DTYPE = precision
create_array()
关键是
utility.DTYPE = precision
,它会更改 DTYPE
模块中的 utility
变量,create_array()
会看到并使用该变量。
如此处所示,这有点笨拙,您可能需要删除导入
DTYPE
的所有其他行并稍微清理一下代码,但访问 module.variable
是修改此共享变量的方法。
这不是很好的封装,您正在有效地更改全局,但这应该可以按要求解决您的问题。