ImportError: cannot import name 'Iterable' from 'collections' in Python

ImportError: cannot import name 'Iterable' from 'collections' in Python

在 Python 与 Atom 在 Mac 上工作。 代码:

from rubik.cube import Cube
from rubik_solver import utils

完整错误:

Traceback (most recent call last):
  File "/Users/Audey/Desktop/solver.py", line 2, in <module>
    from rubik_solver import utils
  File "/Users/Audey/Library/Python/3.10/lib/python/site-packages/rubik_solver/utils.py", line 4, in <module>
    from past.builtins import basestring
  File "/Users/Audey/Library/Python/3.10/lib/python/site-packages/past/builtins/__init__.py", line 43, in <module>
    from past.builtins.noniterators import (filter, map, range, reduce, zip)
  File "/Users/Audey/Library/Python/3.10/lib/python/site-packages/past/builtins/noniterators.py", line 24, in <module>
    from past.types import basestring
  File "/Users/Audey/Library/Python/3.10/lib/python/site-packages/past/types/__init__.py", line 25, in <module>
    from .oldstr import oldstr
  File "/Users/Audey/Library/Python/3.10/lib/python/site-packages/past/types/oldstr.py", line 5, in <module>
    from collections import Iterable
ImportError: cannot import name 'Iterable' from 'collections' (/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/collections/__init__.py)

from rubik_solver import utils 是导致错误的原因,因为当我删除它时错误没有出现。我不确定是什么导致了错误,我检查了那里的代码并在其他来源上找到了它,所以我确定它 应该 可以工作。 有解决办法吗?

Iterable 摘要 class 已从 Python 3.10 中的 collections 中删除。请参阅 3.10 文档的 3.9 collections docs. In the section Removed 中的弃用说明,项目

  • 从集合模块中删除集合抽象基础 类 的弃用别名。 (由 Victor Stinner 在 bpo-37324 中贡献。)

导致您出错的原因。

您可以改用 collections.abc 中的 Iterable,或者如果问题出在无法更新的依赖项中,则使用 Python 3.9。

在 python 版本 3.10 中,您应该改为从 collections.abc 导入 Iterable

from collections.abc import Iterable

或者您可以:

try:
    from collections.abc import Iterable
except ImportError:
    from collections import Iterable

如其他答案所述,问题是从 collections.abccollections 的某些别名从 python 3.10 弃用。

如果由于 third-party 导入而无法修改脚本中的导入,作为临时解决方法,您可以在导入有问题的 third-party 库之前手动设置别名。例如,请参见下面的导入 hyper 库的示例,这会导致与您的类似的问题。

import collections.abc
#hyper needs the four following aliases to be done manually.
collections.Iterable = collections.abc.Iterable
collections.Mapping = collections.abc.Mapping
collections.MutableSet = collections.abc.MutableSet
collections.MutableMapping = collections.abc.MutableMapping
#Now import hyper
import hyper