加载GAMENet的voc_final.pkl时出现TypeError的原因排查
解决加载voc_final.pkl时的TypeError问题
问题定位
你遇到的TypeError: code expected at least 16 arguments, got 15确实是Python版本兼容性导致的核心问题。这个错误的本质是:pickle/dill序列化该文件时使用的Python版本(这类论文源码通常用3.6-3.8版本),和你当前的3.11版本在底层字节码的code对象结构上存在差异——Python 3.8+对函数/类的code对象参数做了调整,旧版本序列化的code对象在新版本中解析时,会出现参数数量不匹配的情况。
排查与解决步骤
- 匹配序列化环境版本:找到GAMENet源码对应的Python版本,创建对应版本的虚拟环境,在该环境中加载pkl文件。
- 重序列化转换格式:如果能搭建旧版本环境,加载原pkl后用当前版本的dill重新序列化:
之后在你的3.11环境中加载新生成的import dill # 在旧版本Python环境中执行 voc = dill.load(open("voc_final.pkl", 'rb')) dill.dump(voc, open("voc_final_py311.pkl", 'wb'), protocol=dill.HIGHEST_PROTOCOL)voc_final_py311.pkl即可。 - 手动重建voc文件:如果无法搭建旧环境,直接查看GAMENet源码中生成
voc_final.pkl的脚本(通常是build_vocab.py这类文件),运行脚本重新生成适配当前Python版本的词汇表文件。 - 降级dill版本:尝试安装和序列化该文件时同版本的dill,比如源码用的是dill==0.3.2,执行
pip install dill==0.3.2后再尝试加载,旧版本dill可能兼容解析旧的code对象。
补充说明
你测试的“未知类加载正常”是因为pickle对未知自定义类会以通用对象形式加载,但code对象属于Python底层核心结构,版本间的参数变化会直接导致解析失败,和普通自定义类的兼容逻辑不同。
内容的提问来源于stack exchange,提问作者JoyfulPanda
相关产品推荐
相关产品推荐

