为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

米脂 2023-07-18 10:26:59
在我的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 回答

?
侃侃无极

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


查看完整回答
反对 回复 2023-07-18
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信