python的全局变量能暂存数据吗_【Python】Python之全局变量
????最近的兩個Python項目由于使用多線程的緣故,需要頻繁用到全局變量。在Tcl/tk中可以使用命名空間的形式限制全局變量的引用范圍。但是在Python中似乎沒有看到類似的定義。在網上看了看關于全局變量的使用方法,大都是提醒盡量不要使用全局變量,因為:(以下為引用)
?
“應該盡量避免使用全局變量。不同的模塊都可以自由的訪問全局變量,可能會導致全局變量的不可預知性。對全局變量,如果程序員甲修改了_a的值,程序員乙同時也要使用_a,這時可能導致程序中的錯誤。這種錯誤是很難發現和更正的。
全局變量降低了函數或模塊之間的通用性,不同的函數或模塊都要依賴于全局變量。同樣,全局變量降低了代碼的可讀性,閱讀者可能并不知道調用的某個變量是全局變量。”
(引用結束)
經過師傅的提醒,我找到一個比較簡單快捷,而且和Tcl/tk有同樣用法的方法:將全局數據保存至文件!
思路很簡單,將需要調用的全局數據保存至一個或多個文件,當程序需要調用時,Python直接使用import載入,Tcl直接使用source -encoding utf-8 filename。這樣就可以避免上述使用global聲明所帶來的困擾了。而且這樣還有一個好處,那就是在調試程序時,不用等待程序正式運行時產生數據,而可以在數據文件中直接手動添加/修改!大大提高了工作效率有木有?!
以下是Python中保存全局數據到文件的例子:
def?save_init():
'''Save?init?data?from?last?correct?config'''
save_init?=?open('init.py','w')
save_init.write("#BMC?IP?Pool\n")
save_init.write("BMC_IP_START?='%s'\n"%BMC_IP_START.get())
save_init.write("BMC_IP_END?='%s'\n"%BMC_IP_END.get())
save_init.write("BMC_USER?='%s'\n"%BMC_USER.get())
save_init.write("BMC_PSW?='%s'\n"%BMC_PSW.get())
save_init.close()
上面的方法,將全局數據寫入init.py
以下是調用全局數據文件的例子:
#Import?Data?from?last?correct?config.
try:
import?init
BMC_IP_START.set(init.BMC_IP_START)
BMC_IP_END.set(init.BMC_IP_END)
BMC_USER.set(init.BMC_USER)
BMC_PSW.set(init.BMC_PSW)
except?(ImportError,AttributeError):
print("init.py:?No?found?init?data!")
注意這里,我使用了try語句。因為并不能保證數據文件里有數據,例如當程序第一次運行還沒有產生數據時。此時調用會產生錯誤,所以要用try語句處理異常。當第二次運行時,文件里已經有數據時,就沒有問題了。
注意,Python的文件載入,也就是import動作只進行一次。因此,用這種方法保存的全局數據經常需要變動時,如果在變動后使用,需要重新載入,否則調用的一直是第一次import時候的數據。重新載入需要用到imb模塊:
from?imp?import?reload
import?init
reload(init)
這樣,就完全避免了傳統全局數據引用的弊端。
總結
以上是生活随笔為你收集整理的python的全局变量能暂存数据吗_【Python】Python之全局变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鱼石脂膏的作用是什么
- 下一篇: python自动生成分析报告_利用PYT