AttributeError: module ‘inspect’ has no attribute ‘getargspec’ の原因は? Python 3.11以降の対処法を解説

Python 3.13ではなく、Python 3.11以降で起きる互換性エラーを整理する

Python の古いライブラリや研究コードを実行していると、AttributeError: module 'inspect' has no attribute 'getargspec' というエラーに当たることがあります。

先に結論を書くと、このエラーの直接原因は inspect.getargspec() が Python 3.11 で削除されたこと にあります。Python 公式の What’s New in Python 3.11 でも、inspect モジュールから getargspec() が削除され、代替として inspect.signature() または inspect.getfullargspec() を使うよう案内されています。(出典: Python Documentation – What’s New In Python 3.11

このエラーの原因

もともと inspect.getargspec() は、Python の関数引数を調べるための古い API でした。ただしこれはかなり前から非推奨扱いで、Python 3.11 でついに削除されました。そのため、古いライブラリが内部で inspect.getargspec() を呼び出していると、Python 3.11 以降ではその時点で AttributeError になります。(出典: Python Documentation – What’s New In Python 3.11

つまりこのエラーは、アプリケーション側の処理内容が悪いというより、実行している Python のバージョンと、ライブラリ側の実装が噛み合っていない ときに起きる典型的な互換性エラーです。特に古い OSS、研究コード、長年更新されていない内部ツールでよく見かけます。

Python 3.13の話ではない

このエラーについては「Python 3.13 から壊れたのでは」と誤解されることがありますが、正しくは Python 3.11 で削除 されています。公式ドキュメントにも、3.11 の変更点として getargspec() の削除が明記されています。したがって、Python 3.11、3.12、3.13 のいずれでも、古いコードが inspect.getargspec() を使っていれば同じエラーが起こりえます。(出典: Python Documentation – What’s New In Python 3.11

どんなときに起きるのか

このエラーは、自分が直接 inspect.getargspec() を書いていなくても起きます。典型例は、依存ライブラリのどこかが古いままで、内部的にこの API を使っているケースです。たとえば古い自動微分ライブラリや、研究系のコード、骨格推定や3D復元系の古い実装などで起こりやすいです。

実例として、人体モデル周辺で今も参照されることがある chumpy では、GitHub issue で Python 3.11 環境において inspect.getargspec が原因のエラーが報告されています。報告では、Python 3.11 と chumpy 0.70 の組み合わせで import 時に問題が出ています。(出典: GitHub – mattloper/chumpy issue #51

どう直せばいいのか

根本的な解決策は、古い inspect.getargspec() を使っているコードを、新しい API に置き換えることです。Python 公式は、代替として inspect.signature() または inspect.getfullargspec() を使うよう案内しています。(出典: Python Documentation – What’s New In Python 3.11

実務上の対処法は大きく3つあります。

  1. ライブラリを最新版や修正版 fork に置き換える
  2. 該当箇所を自分で getfullargspec などへ修正する
  3. どうしても必要なら Python のバージョンを古いものに落とす

特に、自分がメンテしていない古い OSS を使っている場合は、fork 版や修正版がすでに出ていないかを確認する のが最初の一手です。自力パッチは有効ですが、他にも古い API が残っていることがあるため、可能なら互換修正版を使ったほうが楽です。

置き換え例

問題のあるコードは、たとえば次のような形です。

import inspect
args = inspect.getargspec(func)

これを Python 3.11 以降で扱うなら、まずは次のような置き換えが候補になります。

import inspect
args = inspect.getfullargspec(func)

あるいは、用途によってはより新しい API である inspect.signature() のほうが適している場合もあります。どちらが正しいかは、元コードが何を取得したいのかに依存します。(出典: Python Documentation – What’s New In Python 3.11

結局、このエラーは何を意味しているのか

このエラーは、「あなたのコードが壊れている」というより、「古いライブラリが現行 Python に追いついていない」 ことを示している場合が多いです。とくに Python 3.11 以降へ上げた直後に急に発生したなら、原因は高い確率でこの互換性問題です。

したがって、対処の優先順位としては、まず依存ライブラリの issue や修正版 fork を調べ、それでもだめなら局所修正を入れ、最後の手段として Python バージョンを下げる、という流れが現実的です。

まとめ

AttributeError: module 'inspect' has no attribute 'getargspec' の原因は、inspect.getargspec() が Python 3.11 で削除されたことです。これは Python 3.13 特有の問題ではなく、3.11 以降の環境で古いコードを動かしたときに起きる典型的な互換性エラーです。修正方針は、inspect.signature() または inspect.getfullargspec() への移行、あるいは修正版ライブラリの利用です。(出典: Python Documentation – What’s New In Python 3.11

参考リンク

コメント

タイトルとURLをコピーしました