AttributeError: 'NoneType' object has no attribute の原因と直し方
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" にします。
よくある誤解
Noneを代入した行では発生しません。実際にそのNoneに対してメソッドを呼んだ行で初めてエラーになるため、原因箇所を探すには代入元まで遡る必要があります。
まとめ
AttributeError: 'NoneType' object has no attributeは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。