Python运行Chatterbot报AttributeError: collections无Hashable属性
报错原因
该报错与业务代码编写无关,属于依赖版本兼容问题:
- Python 3.10及以上版本正式移除了
collections模块下的Hashable等抽象基类,相关类全部迁移到collections.abc子模块中 - ChatterBot库已长期停止维护,其依赖的低版本PyYAML未做高版本Python适配,仍然调用
collections.Hashable,最终触发属性不存在的错误。
升级依赖、更新Python版本无法解决问题的核心原因是ChatterBot本身没有发布适配Python3.10+的新版本。
修复方案
三种方案任选其一即可:
方案1:降级Python版本
卸载当前Python 3.10,安装3.7~3.9区间的Python版本。这类版本仍保留collections模块下的抽象基类别名,安装ChatterBot后可直接运行现有代码,无需额外修改。
方案2:修改依赖库源码
打开报错栈中提示的PyYAML源码文件,路径为C:\Users\robin\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml\constructor.py,做两处修改:
- 在文件头部导入区域新增一行:
from collections.abc import Hashable
- 定位到报错行
if not isinstance(key, collections.Hashable):,替换为:
if not isinstance(key, Hashable):
保存文件后重新运行代码即可。注意如果后续重装PyYAML,该修改会被覆盖,需要重复操作。
方案3:代码开头加兼容补丁
无需修改依赖、无需更换Python版本,在你的chatbot.py文件最顶部、所有导入语句之前,加入以下补丁代码:
import collections import collections.abc # 兼容高版本Python移除的collections抽象基类 collections.Hashable = collections.abc.Hashable collections.Iterable = collections.abc.Iterable collections.Mapping = collections.abc.Mapping collections.MutableMapping = collections.abc.MutableMapping
补丁会提前将高版本Python中移除的属性映射回collections模块,后续原有代码可直接正常运行,对项目侵入性最低,也能覆盖后续可能触发的其他同类兼容报错。
内容的提问来源于stack exchange,提问作者Jakob Long
相关产品推荐
相关产品推荐

