在我的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
添加回答
舉報
0/150
提交
取消