Code Fix

中級

Noneに対してメソッドを呼び出した原因と直し方

Noneに対してメソッドを呼び出したときに出るエラーです。関数が値を見つけられずNoneを返す場面や、辞書のgetでキーが無かった場合に起きやすいパターンです。

エラーメッセージの読み方

Traceback (most recent call last):
main.py
ファイル名
2
行番号 — 実際にクラッシュした行
<module>
発生場所 — <module> ならトップレベル、関数名ならその関数の中
AttributeError
例外クラス — 何が起きたか。ここを検索するのが最短です
'NoneType' object has no attribute 'upper'
詳細メッセージ — どの値が問題だったか

このエラーが出る典型パターン

パターン1

 1  result = None   
                ^
 2  print(result.upper())
Traceback (most recent call last): File "main.py", line 2, in <module> print(result.upper()) ^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'upper'

Noneに対してメソッドを呼び出すと発生します。Noneを代入した行ではなく、実際に使った行でエラーになります。

直し方: None を "hello" にします。

この問題を解いてみる →

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

パターン2

 1  def find(items, target):
 2      for i in items:
 3          if i == target:
 4              return i
 5  
 6  value = find([1, 2, 3], 5 )
                             ^
 7  print(value.real)
Traceback (most recent call last): File "main.py", line 7, in <module> print(value.real) ^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'real'

見つからなかったときにNoneを返す関数はよくあります。呼び出し側でNoneチェックをしないと、後続の処理で初めてエラーになります。

直し方: 5 を 2 にします。

この問題を解いてみる →

パターン3

 1  user = {"name": "Tom"}
 2  email = user.get("email")
                        ^
 3  print(email.strip())
Traceback (most recent call last): File "main.py", line 3, in <module> print(email.strip()) ^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'strip'

dict.get()は該当キーが無いとNoneを返します(例外にはなりません)。存在確認をしないままメソッドを呼ぶと、ここでエラーになります。

直し方: "email" を "name" にします。

この問題を解いてみる →

パターン4

 1  import re
 2  m = re.match(r"[0-9]+", "abc")
                              ^
 3  print(m.group())
Traceback (most recent call last): File "main.py", line 3, in <module> print(m.group()) ^^^^^^^ AttributeError: 'NoneType' object has no attribute 'group'

re.match()はマッチしない場合Noneを返します(例外にはなりません)。マッチ確認をせずgroup()を呼ぶとここで初めて気づきます。

直し方: "abc" を "123" にします。

この問題を解いてみる →

パターン5

 1  def get_grade(score):
 2      if score >= 60:
 3          return "pass"
 4  
 5  grade = get_grade(40)
                       ^
 6  print(grade.upper())
Traceback (most recent call last): File "main.py", line 6, in <module> print(grade.upper()) ^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'upper'

if文の条件に当てはまらない場合、関数は暗黙にNoneを返します。すべての分岐でreturnを書いていないと起きやすいバグです。

直し方: 40 を 70 にします。

この問題を解いてみる →

よくある誤解

Noneを代入した行では発生しません。実際にそのNoneに対してメソッドを呼んだ行で初めてエラーになるため、原因箇所を探すには代入元まで遡る必要があります。

実務での勘所

実務で最も多い発生源はre.match()やre.search()です。パターンにマッチしなかった場合、例外ではなくNoneを返す設計になっているため、m = re.match(pattern, text)の後にm.group()と続けて書くと、マッチしなかった入力のときだけこのエラーになります。Python 3.8以降は海象演算子を使い、if (m := re.match(pattern, text)) is not None:のように、マッチ結果の取得と存在チェックを1つの条件式にまとめて書くことができ、マッチしなかった場合の分岐忘れを防ぎやすくなります。

演習をはじめる

関連するエラー

他の言語ではどうなるか

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