【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之全局变量)