Python中全局变量的编程技巧

这里写一个关于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日

Leave a Comment