PythonのRuntimeWarningとは?await忘れ・空データの平均・オーバーフローの対処法
先に結論です。RuntimeWarning はエラーではありません。プログラムは止まらず、最後まで動きます。ただし「結果が期待どおりでない可能性がある」という警告なので、無視すると間違った数値のまま処理が進みます。
RuntimeWarningとは
Warning の一種で、実行時におかしな状況を見つけたときに出ます。例外と違って処理は中断されません。
| 例外(Error) | 警告(Warning) | |
|---|---|---|
| 処理 | 止まる | 止まらない |
| 出力先 | 標準エラー+トレースバック | 標準エラー(1回だけのことが多い) |
| 気づきやすさ | 必ず気づく | 見逃しやすい |
| 放置すると | 動かない | 間違った結果のまま進む |
よく見る3つのRuntimeWarning
1. coroutine … was never awaited
import asyncio
async def f():
return 1
f() # await を忘れている
RuntimeWarning: coroutine 'f' was never awaited
非同期関数を呼んだのに await を付け忘れています。async def の関数は、呼んだだけでは実行されません。コルーチンという「これから実行するもの」が返るだけです。
# 直し方1:await を付ける(async 関数の中から)
result = await f()
# 直し方2:同期のコードから呼ぶ
result = asyncio.run(f())
この警告は「何も実行されていない」ことを意味します。エラーが出ないので正常に見えますが、処理が丸ごと抜け落ちています。非同期処理で結果がおかしいときは、まずこの警告を探してください。
2. Mean of empty slice
import numpy as np
print(np.mean([]))
RuntimeWarning: Mean of empty slice
nan
空のデータの平均を計算しようとしています。0個の平均は定義できないため、NumPyは nan(非数)を返して警告します。
原因はたいてい「絞り込んだ結果が0件だった」ことです。フィルタの条件を見直すか、計算前に件数を確認してください。
data = values[values > 100]
if len(data) == 0:
print("該当なし")
else:
print(data.mean())
NumPyの類似の警告には次のものがあります(NumPyのソースで確認)。
| メッセージ | 意味 |
|---|---|
Mean of empty slice |
空のデータの平均 |
All-NaN slice encountered |
全部が nan だった |
Degrees of freedom <= 0 for slice |
標準偏差を出すのにデータが足りない |
invalid value encountered in ... |
0÷0など、結果が nan になった |
divide by zero encountered in ... |
0で割った(inf になる) |
overflow encountered in ... |
数が大きすぎて表現できない |
NumPyは0で割っても止まりません。素のPythonならZeroDivisionErrorで止まりますが、NumPyは警告を出して inf や nan を返し、そのまま計算を続けます。最終結果だけ見ても気づけません。
3. overflow encountered in …
計算結果が扱える範囲を超えました。NumPyの int64 や float64 には上限があります。
対処は型を大きくするか、対数を取るなど計算方法を変えることです。素のPythonの整数は上限がないため、この問題は起きません。
警告を「見逃さない」設定にする
Pythonの警告は既定で1回しか表示されません。ループの中で1000回起きても、画面には1回だけです。
# 毎回表示する
python -W always your_script.py
# 警告をエラーに変えて止める(原因を特定したいとき)
python -W error::RuntimeWarning your_script.py
原因の行を特定したいときは -W error が最短です。警告が例外になるので、トレースバックで発生箇所が分かります。
NumPyだけ厳しくする
import numpy as np
# 0除算やオーバーフローを例外にする
np.seterr(all="raise")
# 一部だけ無視したい場合
with np.errstate(divide="ignore"):
result = a / b
警告を消すこと自体を目的にしないでください。warnings.filterwarnings("ignore") で全部消すのは簡単ですが、本当に見るべき警告まで消えます。消すなら種類と発生箇所を限定してください。
よくある質問
RuntimeWarningは無視していいですか?
いけません。「結果が期待どおりでない可能性がある」という意味です。内容を読んで、意図した動作かどうかを必ず確認してください。
RuntimeErrorとは違いますか?
まったく別物です。RuntimeError は例外で処理が止まります。RuntimeWarning は警告で止まりません。名前が似ているだけです。
警告が1回しか出ません
Pythonの既定の動作です。同じ場所の同じ警告は1回だけ表示されます。python -W always で毎回表示できます。
どの行で出ているか分かりません
python -W error::RuntimeWarning で実行してください。警告が例外になり、トレースバックに発生箇所が出ます。
関連記事
0除算についてはZeroDivisionError、閉じ忘れの警告はResourceWarningをご覧ください。
Pythonのエラー全般はPythonでよく出るエラー一覧、例外処理の書き方はPythonの例外処理(try except)、警告の扱い方はPythonのWarningにまとめています。
テックジムは月額22,000円の通い放題でプログラミング教室を運営しています。東京本校(永田町)では毎週土曜にゼロから始めるPython入門講座、そしてゼロから始めるClaude Code講座を無料で開いています。どちらも説明会ではなく実際に手を動かす講座です。
まとめ
RuntimeWarning は止まらないが結果が怪しいという警告です。止まらないぶん、エラーより危険だと考えてください。
よく見るのはawait忘れ、空データの平均、オーバーフローの3つです。原因の行を知りたいときは python -W error::RuntimeWarning で実行すれば、トレースバックが出ます。






