动态创建可以从任何地方导入的不可变常量?

在我的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”。


已经感谢您的回答,也许您可以向我指出一些似乎适用于这种情况的模式。我只能猜测我不是第一个尝试实现上述目标的人。


米脂
浏览 101回答 1
1回答

侃侃无极

global老实说,如果谨慎使用并且只有在有充分理由时才使用它,我看不出有什么问题。(我认为强烈反对global是因为它经常被滥用。)但是对于您建议的自定义类,不需要实例化它——您只需设置类变量即可。main.pyimport settingssettings.set_foo(3)print(settings.Settings.foo)settings.pyclass Settings:    passdef set_foo(x):    Settings.foo = x原则上,这与将数据项放入其他可变集合(例如字典)中,然后将它们设置在定义它的模块(或导入它的另一个模块)的函数中没有什么不同。main.pyimport settingssettings.set_foo(3)print(settings.settings['foo'])settings.pysettings = {}def set_foo(x):    settings['foo'] = x
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python