Python DeprecationWarningとは?非推奨の警告と対処法

DeprecationWarningは、「この機能は将来なくなります」と伝える警告です。

いま動いていても次のバージョンで動かなくなる——その予告なので、放置してはいけません。


実際に見てみる

import warnings
warnings.simplefilter("always")

import imp

実行結果(Python 3.9):

w8.py:4: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import imp

メッセージに代替手段が書かれています。

「impは非推奨、importlibを使え」——このとおりに直せば将来も動きます。

ちなみにimpモジュールはPython 3.12で実際に削除されました。警告は予告どおりでした。


Exceptionの一種

print([c.__name__ for c in DeprecationWarning.__mro__])

実行結果:

['DeprecationWarning', 'Warning', 'Exception', 'BaseException', 'object']

警告クラスは例外クラスの一種です。

そのためraiseできますし、フィルタをerrorにすればexceptで捕まえられます。

warnings.filterwarnings("error", category=DeprecationWarning)

try:
    非推奨のAPI()
except DeprecationWarning as e:
    print("捕まえた:", e)

既定では表示されない

これが最大の注意点です。

import warnings
for f in warnings.filters:
    print(f)

実行結果:

('default', None, <class 'DeprecationWarning'>, '__main__', 0)
('ignore', None, <class 'DeprecationWarning'>, None, 0)
...
  • __main__(実行したファイル)から出たものは表示される
  • それ以外のモジュールから出たものは無視される

つまりライブラリが出した非推奨警告は、既定では見えません。

これは「エンドユーザーを混乱させない」ための設計ですが、開発者が気づけないという副作用があります。


開発時は必ず有効にする

$ python3 -W default app.py

これだけで隠れていた警告が見えるようになります。

より積極的な方法もあります。

$ python3 -X dev app.py

開発モードでは警告の表示に加えて、各種のチェックが有効になります。Python 3.7以降で使えます。

環境変数でも指定できます。

$ PYTHONWARNINGS=default python3 app.py

CIの設定に入れておくのが最善です。コードを変えずに、チーム全員が警告を見られます。


4つの警告の使い分け

カテゴリ 意味 既定
DeprecationWarning 非推奨(開発者向け) ほぼ非表示
PendingDeprecationWarning 将来非推奨になる予定 非表示
FutureWarning 将来動作が変わる(利用者向け) 表示
UserWarning 一般的な注意 表示

FutureWarningが表示されるのがポイントです。

pandasなどのライブラリがFutureWarningを使うのは、エンドユーザーにも知らせたいからです。「次のバージョンで結果が変わる」という警告は、開発者だけでなく利用者にも重要です。


警告が出たときの対処

順番に確認してください。

  1. メッセージを読む——代替手段が書いてあることが多い
  2. どこから出ているか確認する——自分のコードか、ライブラリか
  3. 自分のコードなら直す
  4. ライブラリなら更新を確認する

どこから出ているか分からないときは、例外にして発生場所を特定します。

import warnings
warnings.filterwarnings("error", category=DeprecationWarning)

トレースバックが出るので、呼び出し経路がすべて分かります。

「Python tracebackとは?エラーの原因を特定する方法を解説」も参照してください。


消してはいけない

import warnings
warnings.simplefilter("ignore")      # やってはいけない

警告が消えても問題は消えません。

次のライブラリ更新で突然動かなくなります。しかも、そのときには警告というヒントも残っていません。

どうしても対処できない場合は、範囲とカテゴリを限定してください。

warnings.filterwarnings(
    "ignore",
    category=DeprecationWarning,
    module="oldlib",              # このライブラリだけ
)

さらにコメントで理由と期限を書いておくことを推奨します。

# oldlib 2.0 で修正予定。2026年中に見直すこと

自分のコードで非推奨を伝える

import warnings

def old_api(x):
    warnings.warn(
        "old_api() は非推奨です。new_api() を使ってください。",
        DeprecationWarning,
        stacklevel=2,
    )
    return new_api(x)

stacklevel=2を忘れないでください。付けないと、警告の発生場所がライブラリの内部行として表示されます。

利用者は自分のどの行が悪いのか分からず、直しようがありません。

「Python warnings.warn()とは?警告を出す方法を解説」で詳しく解説しています。


DeprecationWarningのまとめ

  • 将来なくなる機能の予告——放置すると動かなくなる
  • 警告クラスは例外クラスの一種
  • 既定ではライブラリからの警告が見えない
  • 開発時は-W defaultや-X devで有効化
  • FutureWarningは既定で表示される(利用者向け)
  • 消すならカテゴリとモジュールを限定する

あわせて読みたい

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら