在我的python包中,我有一個(gè)entry_point run.py文件,它將種子(例如42)和cuda設(shè)備(例如“cuda:0”)作為命令行參數(shù)。由于這兩個(gè)變量在整個(gè)包的不同位置使用,因此我不想將它們作為參數(shù)在函數(shù)之間傳遞。因此,我做了以下事情: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 中,我通過調(diào)用設(shè)置這些變量一次:from package.utils import set_device, set_seed_number...set_device(device)set_seed_number(seed=seed)現(xiàn)在我可以從包中的任何位置導(dǎo)入和調(diào)用get_device()andset_seeds方法,并且不必將這些變量作為參數(shù)傳遞。到目前為止,這種方法工作得很好,但是在閱讀了強(qiáng)烈建議不要在 python 中使用全局變量之后,我想知道是否有一種更 Pythonic 的方法來實(shí)現(xiàn)上述目標(biāo)?我已經(jīng)考慮過有一個(gè)專用的 Singleton 類,它會(huì)動(dòng)態(tài)地實(shí)例化這些常量,但我不確定它是否以及如何工作,以及它是否會(huì)被認(rèn)為更“Pythonic”。已經(jīng)感謝您的回答,也許您可以向我指出一些似乎適用于這種情況的模式。我只能猜測我不是第一個(gè)嘗試實(shí)現(xiàn)上述目標(biāo)的人。
1 回答

侃侃無極
TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
global老實(shí)說,如果謹(jǐn)慎使用并且只有在有充分理由時(shí)才使用它,我看不出有什么問題。(我認(rèn)為強(qiáng)烈反對global是因?yàn)樗?jīng)常被濫用。)
但是對于您建議的自定義類,不需要實(shí)例化它——您只需設(shè)置類變量即可。
main.py
import settings
settings.set_foo(3)
print(settings.Settings.foo)
settings.py
class Settings:
pass
def set_foo(x):
Settings.foo = x
原則上,這與將數(shù)據(jù)項(xiàng)放入其他可變集合(例如字典)中,然后將它們設(shè)置在定義它的模塊(或?qū)胨牧硪粋€(gè)模塊)的函數(shù)中沒有什么不同。
main.py
import settings
settings.set_foo(3)
print(settings.settings['foo'])
settings.py
settings = {}
def set_foo(x):
settings['foo'] = x
添加回答
舉報(bào)
0/150
提交
取消