在我的python包中,我有一个entry_point run.py文件,它将种子(例如42)和cuda设备(例如“cuda:0”)作为命令行参数。
由于这两个变量在整个包的不同位置使用,因此我不想将它们作为参数在函数之间传递。因此,我做了以下事情:
utils.py:
import random
import numpy as np
import torch
def set_device(device: str):
global _DEVICE
_DEVICE = torch.device(device)
def get_device() -> torch.device:
return _DEVICE
def set_seed_number(seed: int):
global _SEED
_SEED = seed
def set_seeds():
torch.manual_seed(_SEED)
random.seed(_SEED)
np.random.seed(_SEED)
然后在 run.py 中,我通过调用设置这些变量一次:
from package.utils import set_device, set_seed_number
...
set_device(device)
set_seed_number(seed=seed)
现在我可以从包中的任何位置导入和调用get_device()andset_seeds方法,并且不必将这些变量作为参数传递。
到目前为止,这种方法工作得很好,但是在阅读了强烈建议不要在 python 中使用全局变量之后,我想知道是否有一种更 Pythonic 的方法来实现上述目标?
我已经考虑过有一个专用的 Singleton 类,它会动态地实例化这些常量,但我不确定它是否以及如何工作,以及它是否会被认为更“Pythonic”。
已经感谢您的回答,也许您可以向我指出一些似乎适用于这种情况的模式。我只能猜测我不是第一个尝试实现上述目标的人。
侃侃无极
相关分类