Code Fix

上級

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を使います。

直し方: discountdiscount 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を使い、値そのものの真偽値と混同しないようにします。

直し方: namename 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かどうかだけを見る必要があります。

直し方: tagstags is not None にします。

この問題を解いてみる →

よくある誤解

if x: と if x is not None: は多くの場合同じ結果になるため、違いに気づかないまま使われがちです。0や空文字列を正当な入力として扱いたい場面で初めて問題が表面化します。

まとめ

0や空文字列を「値が無い」と誤判定してしまうは上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)