PythonのNone判定における注意点
はじめに
Pythonで実装していて、
「この値がNoneじゃないときだけ処理したい」
そのような場合、以下どちらで書いていますか?
if value:
# 処理
if value is not None:
# 処理
最初、私は「どちらも同じ」という認識でした。
しかし、実は 挙動に違い があります。
本記事では、
if value と if value is not None の違いと、
「どこまで気をつけるべきか」について解説します。
if value の判定
if value は、「truthy/falsy判定」 に基づいています。
Pythonでは次のような値が falsy(偽扱い) になります。
NoneFalse-
0(数値ゼロ) -
''(空文字列) -
[](空リスト) -
{}(空辞書) -
set()(空セット)
つまり、Noneだけじゃなく「空」や「0」もFalse扱いになります。
例
value = 0
if value:
print('値あり')
else:
print('値なし')
出力結果:
値なし
value が 0 なので 「値なし」扱い になります。
if value is not None の判定
一方、if value is not None は
「Noneかどうかを明示的に判定」 します。
0でも、空でも、None以外なら True扱い となります。
例
value = 0
if value is not None:
print('値あり')
else:
print('値なし')
出力結果:
値あり
value が 0 でも 「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 NoneはNoneだけを除外
判断基準:
「0や空文字を有効と見なしたいか?」で判断すると良いです。
おわりに
私自身、「None判定は if value で十分だ」と思っていましたが、
実務で「0や''が除外されてしまうバグ」を経験しました。
本記事が一助になれば幸いです。
Discussion