亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

動態創建可以從任何地方導入的不可變常量?

動態創建可以從任何地方導入的不可變常量?

米脂 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 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號