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(偽扱い) になります。
None
False
-
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