Python主程序变量访问:模块多函数无需传参共享loaddict
解决方案:让模块函数共享主程序字典的几种方法
你原来的代码里用global无效,是因为global loaddict声明的是**当前模块(BeamDiagram)**的全局变量,但你在dgm函数里又把loaddict作为参数传入(参数名和全局变量重名),而且主程序里的loaddict属于main模块,和BeamDiagram的全局变量不是同一个。下面是几种靠谱的解决办法:
方法1:模块级全局变量
在BeamDiagram模块里定义一个模块级变量,主程序初始化后,模块内所有函数都能直接访问:
修改后的BeamDiagram.py
# 定义模块级全局变量,初始化为None loaddict = None def dgm(other_parameters): # 仅当需要重新赋值loaddict本身时才需要global,修改字典内容不需要 # global loaddict loaddict['calculation_result'] = 123 # 其他计算逻辑... def function1(some_parameters): # 直接使用模块级loaddict total = sum(loaddict.values()) # 其他计算... def function2(some_parameters): pass def function3(some_parameters): pass
修改后的main.py
# 用户输入数据初始化字典 loaddict = {'some data': 'test_value'} # 先导入模块,再把主程序的loaddict赋值给模块的全局变量 import BeamDiagram BeamDiagram.loaddict = loaddict # 调用模块函数,无需再传loaddict BeamDiagram.dgm(other_parameters) BeamDiagram.function1(some_parameters)
方法2:面向对象封装(更推荐)
把需要用到loaddict的函数封装成类的方法,初始化类时传入loaddict,所有方法都能通过self.loaddict访问:
修改后的BeamDiagram.py
class BeamDiagramHandler: def __init__(self, loaddict): # 将字典保存为实例属性 self.loaddict = loaddict def dgm(self, other_parameters): self.loaddict['result'] = 456 # 其他计算... def function1(self, some_parameters): print(self.loaddict.get('some_key')) # 其他计算... def function2(self, some_parameters): pass def function3(self, some_parameters): pass
修改后的main.py
loaddict = {'some data': 'test_value'} # 导入类并实例化,传入loaddict from BeamDiagram import BeamDiagramHandler handler = BeamDiagramHandler(loaddict) # 调用实例方法 handler.dgm(other_parameters) handler.function1(some_parameters)
方法3:闭包(适合小范围函数共享)
如果只有少数函数需要共享字典,可以用闭包把函数和字典绑定:
BeamDiagram.py
def create_beam_functions(loaddict): def dgm(other_parameters): loaddict['updated_key'] = 'new_value' # 计算逻辑... def function1(some_parameters): print(loaddict) # 计算逻辑... def function2(some_parameters): pass return dgm, function1, function2
main.py
loaddict = {'some data': 'test_value'} from BeamDiagram import create_beam_functions dgm, function1, function2 = create_beam_functions(loaddict) # 调用函数,无需传loaddict dgm(other_parameters) function1(some_parameters)
内容的提问来源于stack exchange,提问作者Hong Rui Ong
相关产品推荐
相关产品推荐

