翻译 Matlab 程序到 Python 时发现 Python 的 global 变量仅在当前文件内有效,因此需要找到一种方法实现跨文件的全局变量。
Python导入Model 时是导入同一个Model文件中的对象,因此可以用模块跨文件共享变量,故实现方法如下:
from typing import Any, Iterable, TypeVar
NameType = TypeVar('NameType', str, Iterable[str])
class GlobalVariable:
def __init__(self) -> None:
pass
def all(self):
attrs = [i for i in dir(self)]
attr = []
for i in range(len(attrs)):
if len(attrs[i]) > 1:
if '__' == attrs[i][:2]:
continue
if attrs[i] in ['all', 'add', 'rm', 'get']:
continue
attr.append(attrs[i])
return attr
def add(self, name:NameType, value:Any):
if isinstance(name, Iterable) \
and (not isinstance(value, Iterable)):
raise TypeError("value should be Iterable when name is Iterable")
if type(name) is str:
name = [name]
value = [value]
for n, v in zip(name, value):
exec('self.{}={}'.format(n, v))
def rm(self, name:NameType):
if type(name) is str:
name = [name]
for n in name:
self.__delattr__(n)
def get(self, name:NameType):
if type(name) is str:
return self.__getattribute__(name)
else:
attrs = []
for n in name:
attrs.append(self.__getattribute__(n))
return attrs
global globalVariables
try:
tmp = globalVariables.all()
except NameError:
globalVariables = GlobalVariable()
else:
pass
将上述代码打包进 GlobalVariable.py 文件作为Python 模块,保存变量。
将变量打包进GlobalVariable类的 globalVariable实例中方便管理,同时增加 add(), rm(), all()方法方便对变量进行操作。
使用类属性管理变量,内存占用应该能比字典方式低。文件最后try-except语句自动实例化类,简化操作。
使用前仅需将GlobalVariable.py文件添加进可 import 的路径或用 sys.path.append 方法添加文件路径,然后
from GlobalVariable import globalVariables as gbv
添加变量:
# 添加一个名为 newVariable 的变量
# 方法一
gbv.newVariable = 199
# 方法二
gbv.add('newVariable', 199)
# 添加一系列变量
nameList = ['a', 'b', 'c']
valueList = [100, 200, 300]
gbv.add(nameList, valueList)
获取变量值:
# 方法一
gbv.varName
#方法二
gbv.get('varName')
nameList = ['name1', 'name2', 'name3']
gbv.get(nameList)
删除变量:
gbv.rm('variableName')
显示所有变量名:
gbv.all()
仓库见: