🔖

PythonのNone判定における注意点

に公開

はじめに

Pythonで実装していて、
この値がNoneじゃないときだけ処理したい
そのような場合、以下どちらで書いていますか?

if value:
    # 処理
if value is not None:
    # 処理

最初、私は「どちらも同じ」という認識でした。
しかし、実は 挙動に違い があります。

本記事では、
if valueif value is not None の違いと、
「どこまで気をつけるべきか」について解説します。

if value の判定

if value は、「truthy/falsy判定」 に基づいています。
Pythonでは次のような値が falsy(偽扱い) になります。

  • None
  • False
  • 0 (数値ゼロ)
  • '' (空文字列)
  • [] (空リスト)
  • {} (空辞書)
  • set() (空セット)

つまり、Noneだけじゃなく「空」や「0」もFalse扱いになります。

value = 0

if value:
    print('値あり')
else:
    print('値なし')

出力結果:

値なし

value0 なので 「値なし」扱い になります。

if value is not None の判定

一方、if value is not None
Noneかどうかを明示的に判定」 します。

0でも、空でも、None以外なら True扱い となります。

value = 0

if value is not None:
    print('値あり')
else:
    print('値なし')

出力結果:

値あり

value0 でも NoneではないのでTrue」 になります。

どちらを使うべきか

用途によりますが、
「0 や 空文字も有効な値として扱いたい」場合は is not None を使うべき です。

もし if value で書いてしまうと、
0'' も「偽扱い」でスキップされる ので、意図しない動きになる可能性があります。

実務での使い分け指針

書き方 判定 使用場面
if value truthy/falsy 「空ならスキップでいい」ケース
if value is not None None判定のみ 0や空文字は有効な値として扱いたい

具体例:フォームの入力チェック

例えば ユーザーが「0」と入力してきたとき
「空」と見なしてはいけません。

value = int(input('数字を入力: ')) # ← 0を入力

if value:
    print('有効な入力です')
else:
    print('入力がありません')

出力結果:

入力がありません

→ この場合は is not None ではなく、
0 も有効」とする別の条件式が必要です。

正しく判定するには

value is not None「値がNoneでない」ことを確認した上で、
数値そのもののチェックを行うと良いです。

value = int(input('数字を入力: ')) # ← 0を入力

if value is not None:
    print('有効な入力です')
else:
    print('入力がありません')

出力結果:

有効な入力です

input() は基本的に文字列を返すため、 None が直接入るケースはありません。
ただし「入力がない=空文字」の場合など、後続処理で None が代入される可能性には注意が必要です。

value = int(input('数字を入力: ')) # ← 0を入力

if value >= 0:
    print('有効な入力です')
else:
    print('入力がありません')

出力結果:

有効な入力です

if value と書くと0は 偽と判定されてしまう」 ことに留意しましょう。
また、その場面に合った条件を書く必要がある という点を押さえましょう。

まとめ

  • if value「空」「0」もFalse扱い
  • if value is not NoneNoneだけを除外

判断基準:
0や空文字を有効と見なしたいか?」で判断すると良いです。

おわりに

私自身、「None判定は if value で十分だ」と思っていましたが、
実務で「0''が除外されてしまうバグ」を経験しました。

本記事が一助になれば幸いです。

Discussion