在我的python包中,我有一个entry_point run.py文件,它将种子(例如42)和cuda设备(例如“cuda:0”)作为命令行参数。由于这两个变量在整个包的不同位置使用,因此我不想将它们作为参数在函数之间传递。因此,我做了以下事情:utils.py:import randomimport numpy as npimport torchdef set_device(device: str): global _DEVICE _DEVICE = torch.device(device)def get_device() -> torch.device: return _DEVICEdef set_seed_number(seed: int): global _SEED _SEED = seeddef 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”。已经感谢您的回答,也许您可以向我指出一些似乎适用于这种情况的模式。我只能猜测我不是第一个尝试实现上述目标的人。
1 回答
![?](http://img1.sycdn.imooc.com/5458464a00013eb602200220-100-100.jpg)
侃侃无极
TA贡献2051条经验 获得超10个赞
global老实说,如果谨慎使用并且只有在有充分理由时才使用它,我看不出有什么问题。(我认为强烈反对global是因为它经常被滥用。)
但是对于您建议的自定义类,不需要实例化它——您只需设置类变量即可。
main.py
import settings
settings.set_foo(3)
print(settings.Settings.foo)
settings.py
class Settings:
pass
def set_foo(x):
Settings.foo = x
原则上,这与将数据项放入其他可变集合(例如字典)中,然后将它们设置在定义它的模块(或导入它的另一个模块)的函数中没有什么不同。
main.py
import settings
settings.set_foo(3)
print(settings.settings['foo'])
settings.py
settings = {}
def set_foo(x):
settings['foo'] = x
添加回答
举报
0/150
提交
取消