0や空文字列を「値が無い」と誤判定してしまう
0、空文字列、空リストはすべてfalsyですが、「値が渡されていない」こととは意味が違います。if x: で済ませると、意図的に渡されたfalsyな値を見落とします。
なぜエラーが出ないのか
出力: 10
(エラーなし)- Pythonは何も報告しません。文法として正しいためです
出力: 10- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 def get_discount(discount=None): 2 if discount : ^ 3 return discount 4 return 10 5 6 print(get_discount(0))
出力: 10期待: 0 (エラーにはなりません)
0や空文字列、空リストは「値が無い」ことと「falsyな値」を混同しやすい典型例です。値が渡されたかどうかを調べたい場合はis not Noneを使います。
直し方: discount を discount is not None にします。
広告
広告スロット(未設定)
パターン2
1 def get_username(name=None): 2 if name : ^ 3 return name 4 return "guest" 5 6 print(repr(get_username("")))
出力: 'guest'期待: '' (エラーにはなりません)
空文字列は「値が渡された」ことに変わりありません。「値が無い」かどうかの判定にはis not Noneを使い、値そのものの真偽値と混同しないようにします。
直し方: name を name is not None にします。
パターン3
1 def get_tags(tags=None): 2 if tags : ^ 3 return tags 4 return ["default"] 5 6 print(get_tags([]))
出力: ['default']期待: [] (エラーにはなりません)
空リストを意図的に渡した場合でも「値が無い」と誤判定されます。呼び出し側が空リストを渡した意図まで尊重するには、Noneかどうかだけを見る必要があります。
直し方: tags を tags is not None にします。
よくある誤解
if x: と if x is not None: は多くの場合同じ結果になるため、違いに気づかないまま使われがちです。0や空文字列を正当な入力として扱いたい場面で初めて問題が表面化します。
まとめ
0や空文字列を「値が無い」と誤判定してしまうは上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。