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を使うのは、エンドユーザーにも知らせたいからです。「次のバージョンで結果が変わる」という警告は、開発者だけでなく利用者にも重要です。
警告が出たときの対処
順番に確認してください。
- メッセージを読む——代替手段が書いてあることが多い
- どこから出ているか確認する——自分のコードか、ライブラリか
- 自分のコードなら直す
- ライブラリなら更新を確認する
どこから出ているか分からないときは、例外にして発生場所を特定します。
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は既定で表示される(利用者向け)- 消すならカテゴリとモジュールを限定する






