1. 程式人生 > >【Python】動態宣告變數,並賦值

【Python】動態宣告變數,並賦值

我遇到的具體場景稍複雜,簡單概括就是標題描述的場景。

也搜了很多資料,這裡簡單總結一下。

有配置檔案 conf.toml,該檔案用python toml庫讀取,這裡簡單理解為返回字典形式的配置項,

如 

config = {'user': '123', 'passwd': '123', 'time1': 10, 'after_open_time': 20}

在主程式改進過程中,需要不斷新增新的配置,並且作為常量。之前寫法:

USER,\
PASSWD,\
TIME1, \
AFTER_OPEN_TIME =
(
config.get('user'),
config.get('passwd'),
config.get('time1'),
config.get('after_open_time')
)

這種寫法相當麻煩,而且重複。寫程式碼最忌諱的就是重複,當大量結構相似的重複程式碼出現時,說明這些程式碼沒寫好,還可以抽象,所以,能不能有一種方法可以動態生成變數並賦值呢?有!

# 基本方法
# globals python內建函式,提供了基於字典的訪問全域性變數的方式,
# 它的鍵為變數名,值為變數值

cfg_name = ('USER', 'PASSWD', 'TIME1', 'AFTER_OPEN_TIME')

for i in cfg_name:
    globals[i] = config.get(i.lower(), '')
# 實際的需求解決起來一樣,只不過是配置字典中巢狀著字典而已
# 以下是我的實際需求的解決。如果有興趣可以繼續,沒有興趣,上邊的程式碼已經解決了標題的問題。

def make_var_dync(var_tuple, val_dict, time_val=None):
    """
    2018-9-21(create)
    動態地生成全域性變數,並賦值。
    大量減少大重複程式碼。
    這裡其實是動態地取val_dict中各個時間值,可設定預設時間值
    :param var_tuple: tuple/(var_str1, var_str2, ... var_strn),包含變數名稱的元組
    :param val_dict: dict/包含變數所需值的字典
    :param time_val: int/若獲取不到值時賦予的預設值,若不設定,預設值為10
    :return:
    """

    time_val = int(time_val) if time_val else 10

    for i in var_tuple:
        globals()[i] = val_dict.get(i.lower(), time_val)


# 這個其實是配置檔案解讀後的一種返回樣例,實際配置項很多,這裡只是demo
config = {
'base_cfg_name': {'user': '123', 'passwd': '123'},
'time_cfg_name': {'after_open': 10, 'after_click': 20}
}




base_cfg_name = (
    'USER',
    'PASSWD'
)

time_cfg_name = (
    'AFTER_OPEN',
    'AFTER_CLICK'
)

base_cfg = config["base"]
time_cfg = config["interval"]


# 建立名稱與值字典對應關係,為下一步動態賦值做準備
all_cfg_name_val = {
    'base_cfg_name': base_cfg,
    'time_cfg_name': time_cfg
}

# 動態生成全域性變數並賦值
for names, vals in all_cfg_name_val.items():
    make_var_dync(eval(names), vals)

如此改造之後,我只需在相應的xxx_cfg_name中新增上配置的名稱(或者說是需要從配置檔案中取值的全域性變數的名稱),就能簡單的生成全域性變數並賦予其相應的值。

就可以省去像文章最開始那樣重複的寫從字典獲取值的程式碼的操作,避免程式碼和時間的浪費。

時間是最稀有的資源,更多的時間應該花在更有意義的事情上。

The end.