python如何動態的更新引用引數

2021-10-01 10:45:09 字數 3051 閱讀 9493

目前測試有兩種方法:

config.ini

[server]

interval = 3

args_parser.py

import configparser

# 全域性變數

config_file = "config.ini"

def read_config(config_file_name):

config = configparser.configparser(interpolation=configparser.extendedinterpolation())

config.read(config_file_name)

return config

config = read_config(config_file)

test.py

import time

import os

from datetime import datetime

import args_parser

while 1:

reload(args_parser)

d = datetime.now()

config = args_parser.config

v = config['server']['interval']

print "%s :: %s" % (d, v)

time.sleep(1)

這種方法的問題是,每次迴圈都要reload一下,自然影響機器開銷不說,看著心裡也不爽。

因此考慮把reload單獨放到外面

加入中間處理程式args_reloader.py。

import args_parser

from decorators import run_period, wrap_threading

@wrap_threading

@run_period(interval=10)

def reload_args():

print("reload args")

reload(args_parser)

reload_args()

# 用來對比

config = args_aprser.config

其中wrap_threading表示這個程式用單獨乙個執行緒跑,run_period表示每個一段時間這個程式跑一次。這兩個組合就是開啟乙個新執行緒,這個執行緒是每個一段時間跑一下程式。

test.py更改為:

import time

import os

from datetime import datetime

#from args_parser import config

import args_reloader

while 1:

d = datetime.now()

config = args_reloader.args_parser.config

v = config['server']['interval']

print "%s :: %s" % (d, v)

time.sleep(1)

其中config,必須這樣序列寫,因為reload其實更改了args_parser裡面的東西,所以這樣寫是有效的,寫成args_reloader.config指向的還是第一次讀取的config。

方法1不管怎麼看,都是很麻煩的方式,先不說寫法麻煩,而且強耦合。

所以自然有第二種寫法,本質在於python的乙個模組就是乙個單例模式。

import args_parser

from decorators import run_period, wrap_threading

import configparser

# 全域性變數

config_file = "config.ini"

config = none

@wrap_threading

@run_period(interval=10)

def read_config_dyn():

print("read config")

args_parser.config = read_config(config_file)

def read_config(config_file_name):

config = configparser.configparser(interpolation=configparser.extendedinterpolation())

config.read(config_file_name)

return config

test.py:

import time

import os

from datetime import datetime

import args_parser

from args_parser_updater import read_config_dyn

read_config_dyn()

while 1:

#reload(args_parser)

d = datetime.now()

config = args_parser.config

v = config['server']['interval']

print "%s :: %s" % (d, v)

time.sleep(1)

重點在於:

from args_parser_updater import read_config_dyn

read_config_dyn()

可以看出,這種寫法很簡單,同時也和模組松耦合,實際在開發中需要單獨加個中間模組來儲存更新的引數,程式的其他部分都從中間模組中讀取引數。

所以在寫程式的時候,模組級別的變數輸入,最好寫法是 import 模組,然後根據 模組.變數名的方式 來寫。

python 模組引用 python如何引用模組

模組實際上就是 以.py為結尾的檔案 注意點 自定義的模組盡量不要和系統模組重名 模組內部封裝了很多實用的功能,有時在模組外部呼叫就需要將其匯入,匯入模組簡單劃分,實際上就只有兩種 import from import 詳細一點劃分有五種 1,improt 模組名 呼叫 模組名.功能名 2,impo...

python 如何更新 Python列表如何更新值

序列是python中最基本的資料結構。序列中的每個元素都分配乙個數字 它的位置,或索引,第乙個索引是0,第二個索引是1,依此類推。python有6個序列的內建型別,但最常見的是列表和元組。序列都可以進行的操作包括索引,切片,加,乘,檢查成員。此外,python已經內建確定序列的長度以及確定最大和最小...

python 使用小技巧(動態更新)

1 找出含有特定字串的行res res res choice str.contains 2 找出第乙個字元是 9 的行res res res choice str 0 9 3 提高多層行索引的 dataframe 的搜尋效率col one two c u 9對於以上結構的兩層行索引 datafram...