Python跨模块访问dict显示为空报KeyError如何解决?
问题原因
- 你的代码存在循环导入问题,执行顺序导致
user_dict还没完成初始化就被File2调用了:- 运行File1.py时,第一行是
import file2,此时会先执行File2.py的全部顶层代码 - File2.py第一行是
import File1,这时候又会跳回执行File1的代码,但此时File1的user_dict = {}、类定义、函数定义都还没执行到,更不用说最后一行的add_data()调用 - 等到File2的导入完成,回到File1执行后续代码把数据写入
user_dict的时候,File2里之前拿到的File1模块还是未完成初始化的版本,自然是空字典
- 运行File1.py时,第一行是
解决方法
方法1:调整导入位置,避免顶层循环导入
把File1.py第一行的import file2移到add_data函数内部,这样导入File2的时候,File1的user_dict已经完成初始化:
修改后的File1.py代码:
user_dict = {} class User: def __init__(self, chat_id): self.chat_id = chat_id self.refer_count = None self.wallet = None self.message_id = None self.total_amount = None self.first_name = None self.who_invite = None self._id = None self.trnx_id = None def add_data(): import file2 # 把导入移到函数内部 user = User('123') user.chat_id = '123' user.who_invite = '012' user.refer_count = 0 user.total_amount = 0.0 user.first_name = 'user' user_dict['123'] = user file2.print_chat_id() def getUserDict(chat_id): return user_dict[chat_id] add_data()
File2.py代码无需修改,直接运行File1.py就能正常输出123。
方法2:拆分公共存储到第三方模块,彻底避免循环导入
把user_dict、User类、getUserDict这类公共逻辑单独放到新文件common.py中,File1和File2都导入这个公共模块,从根源上消除循环导入:
common.py代码:
user_dict = {} class User: def __init__(self, chat_id): self.chat_id = chat_id self.refer_count = None self.wallet = None self.message_id = None self.total_amount = None self.first_name = None self.who_invite = None self._id = None self.trnx_id = None def getUserDict(chat_id): return user_dict[chat_id]
修改后的File1.py:
import file2 from common import user_dict, User def add_data(): user = User('123') user.chat_id = '123' user.who_invite = '012' user.refer_count = 0 user.total_amount = 0.0 user.first_name = 'user' user_dict['123'] = user file2.print_chat_id() add_data()
修改后的File2.py:
from common import getUserDict def print_chat_id(): user = getUserDict('123') print(user.chat_id)
额外注意
不同操作系统对文件名大小写敏感程度不同,导入模块时的文件名要和实际文件名的大小写完全一致,避免出现找不到模块的额外错误。
内容的提问来源于stack exchange,提问作者Drop Guruji
相关产品推荐
相关产品推荐

