这里写一个关于Python编程的小技巧,怕以后忘记了,记录在博客中用于反查。
在模块化的Python程序架构中,可能需要用到全局变量用于保存整个程序中一些通用配置。这些全局变量是跨py文件的,如果通过参数的形式进行传递可能会导致参数量过多,逻辑混乱,因此需要通过全局变量的形式解决。本文中将列出两种实现方案,第一种是通过Google搜索到的,第二种是自己琢磨出来的。
由于之前没有写过(阅读过)相关代码,所以我先通过Google找到了一个网上比较常见的实现。
首先创建一个global_common.py文件用于保存全局变量。
def _init(): global _global_params _global_params = {} def set_value(key, value): _global_params[key] = value def get_value(key, default_value=None): try: return _global_params[key] except KeyError: return default_value
然后创建一个operation.py文件作为变量操作模块。这里我们尝试将key为record的变量加一。
import global_common as glc def op(): glc.set_value('record', glc.get_value('record') + 1)
最后我们创建一个main.py文件作为程序入口与主程序。首先初始化全局变量,然后依次在主程序,operation模块,主程序上对key为record的变量加一。
import operation import global_common as glc glc._init() glc.set_value('record', 1) print(glc.get_value('record')) glc.set_value('record', glc.get_value('record') + 1) print(glc.get_value('record')) operation.op() print(glc.get_value('record')) glc.set_value('record', glc.get_value('record') + 1) print(glc.get_value('record'))
接下来我们在终端上运行python main.py。便可以看到以下运行结果:
1 2 3 4
这种方法下,全局变量通过set_value与get_value接口进行操作。但是我在实际应用于项目时发现这种方法非常不直观,反复的接口调用显得程序看上非常臃肿。因此我自己琢磨出了以下方法。
首先创建一个global_common.py文件用于保存全局变量。
class GlobalParams(object): def __init__(self): self._params = {} global_params = GlobalParams()
然后我们同样创建一个operation.py文件用于操作全局变量,使key为record的变量加一。
from global_common import global_params as glp def op(): glp._params['record'] += 1
最后我们创建一个main.py文件作为程序入口与主程序。同样的,我们也依次在主程序,operation模块,主程序中对key为record的变量进行加一操作。
import opration from global_common import global_params as glp glp._params['record'] = 1 print(glp._params['record']) glp._params['record'] += 1 print(glp._params['record']) operation.op() print(glp._params['record']) glp._params['record'] += 1 print(glp._params['record'])
接下来我们在终端上运行python main.py。同样可以看到以下运行结果:
1 2 3 4
第二种方法看上去简洁直观,没有复杂的变量读取写入接口,很容易就能看出程序的操作目的。第二种方法也有利于将程序写成完全的面向对象编程的形式,个人更喜欢这种方法写出来的代码风格。
Yannx
2019年12月20日