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())
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)
見つからなかったときにNoneを返す関数はよくあります。呼び出し側でNoneチェックをしないと、後続の処理で初めてエラーになります。
直し方: 5 を 2 にします。
パターン3
1 user = {"name": "Tom"} 2 email = user.get("email") ^ 3 print(email.strip())
dict.get()は該当キーが無いとNoneを返します(例外にはなりません)。存在確認をしないままメソッドを呼ぶと、ここでエラーになります。
直し方: "email" を "name" にします。
パターン4
1 import re 2 m = re.match(r"[0-9]+", "abc") ^ 3 print(m.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())
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つの条件式にまとめて書くことができ、マッチしなかった場合の分岐忘れを防ぎやすくなります。
関連するエラー
- メソッド名のタイプミスで出るAttributeErrorの原因メソッド名の綴りミスや、他言語の命名習慣(add・trim・toUpperCaseなど)を持ち込んだときに出るエラーです。
- KeyError の原因と直し方辞書に存在しないキーへアクセスしたときに出るエラーです。