Code Fix

中級

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チェックをしないと、後続の処理で初めてエラーになります。

直し方: 52 にします。

この問題を解いてみる →

パターン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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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