You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加载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重新序列化:
    import dill
    # 在旧版本Python环境中执行
    voc = dill.load(open("voc_final.pkl", 'rb'))
    dill.dump(voc, open("voc_final_py311.pkl", 'wb'), protocol=dill.HIGHEST_PROTOCOL)
    
    之后在你的3.11环境中加载新生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:12:01