クイック修正
Python 3.10では、バージョン3.3から非推奨となっていたいくつかのエイリアスがついに廃止されました。修正は簡単です。インポート元を collections から collections.abc に変更するだけです。
# ❌ Python 3.10以降では失敗する
import collections
def is_function(obj):
return isinstance(obj, collections.Callable)
# ✅ すべてのバージョンで動作する
from collections.abc import Callable
def is_function(obj):
return isinstance(obj, Callable)
もしこのエラーが自身で記述していないライブラリ内で発生している場合は、まずアップデートを試してください。ターミナルで以下のコマンドを実行します。
pip install --upgrade <package_name>
原因について
約9年もの間、Pythonは抽象基底クラス(ABC)に対して重複したリファレンスを維持してきました。これらは collections と collections.abc の両方で参照可能でした。この冗長性は、2012年の Python 3.3 リリース後、開発者がコードを移行するための猶予期間として設けられていたものです。
その猶予期間は Python 3.10 で終了しました。2021年以降アップデートされていないライブラリは、この問題に直面する可能性が高いです。Callable が最も一般的な原因ですが、Iterable、Mapping、MutableMapping、Sequence でも同様のエラーが発生することがあります。
自身のコードを修正する
ソースコードを編集できる場合は、すぐにインポート文を更新すべきです。これにより、コードの将来性が高まり、よりクリーンになります。
方法1:モダンなインポート(推奨)
collections モジュール全体をインポートするのではなく、abc サブモジュールから必要なものだけを取得します。
# 以前の方法:
# import collections
# my_list = isinstance(obj, collections.Sequence)
# 新しい方法:
from collections.abc import Sequence
my_list = isinstance(obj, Sequence)
方法2:非常に古い Python バージョンへの対応
Python 2.7 と 3.12 を同時にサポートする必要がありますか? try-except ブロックを使用して、世代を超えてインポートを適切に処理します。
try:
from collections.abc import Callable
except ImportError:
# Python 3.3 より古いバージョン向けのフォールバック
from collections import Callable
サードパーティライブラリの破損を修正する
このエラーは、古いバージョンの requests、PyYAML、Jinja2 を使用しているときによく発生します。サーバーを Ubuntu 22.04 や macOS Sonoma にアップグレードしたばかりであれば、古い仮想環境が突然動作しなくなることがあります。
ステップ1:原因を特定する
ターミナルのトレースバックを確認してください。site-packages フォルダ内の特定のファイルを指し示しているはずです。例えば、エラーログに jinja2/tests.py と表示されていれば、Jinja2 が原因であることがわかります。
ステップ2:パッケージを更新する
主要なライブラリの多くは、数年前に修正版をリリースしています。競合を解決するために最新バージョンに更新してください。
pip install --upgrade jinja2 PyYAML requests
ステップ3:「モンキーパッチ」による応急処置
メンテナンスが終了したレガシーライブラリを使用せざるを得ない場合があります。ソースコードを直接編集できない場合は、「モンキーパッチ」を使用します。以下のスニペットを、他のどのインポートよりも前に main.py や manage.py ファイルの最上部に追加してください。
import collections
# 欠落している属性を手動で再追加する
if not hasattr(collections, 'Callable'):
import collections.abc
collections.Callable = collections.abc.Callable
collections.Iterable = collections.abc.Iterable
collections.Mapping = collections.abc.Mapping
collections.MutableMapping = collections.abc.MutableMapping
collections.Sequence = collections.abc.Sequence
動作確認
以下のワンライナーを実行して修正を確認します。エラーなしで「Success」と表示されれば成功です。
python3 -c "from collections.abc import Callable; print('Success')"
モンキーパッチを使用した場合は、アプリケーションを再起動してください。AttributeError が消え、Python 3.10 以降でもアプリが正常に起動するようになります。

