Code Fix

中級

メソッド名のタイプミスで出るAttributeErrorの原因

メソッド名の綴りミスや、他言語の命名習慣(add・trim・toUpperCaseなど)を持ち込んだときに出るエラーです。

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

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

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

パターン1

 1  name = "tom"
 2  print(name.uper       ())
                    ^
Traceback (most recent call last): File "main.py", line 2, in <module> print(name.uper()) ^^^^^^^^^ AttributeError: 'str' object has no attribute 'uper'. Did you mean: 'upper'?

メソッド名の綴りミスです。似た名前のメソッドが存在する場合はPythonが候補を提示してくれます。

直し方: uper を upper にします。

この問題を解いてみる →

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

パターン2

 1  nums = [1, 2, 3]
 2  nums.add   (4)
            ^
 3  print(nums)
Traceback (most recent call last): File "main.py", line 2, in <module> nums.add(4) ^^^^^^^^ AttributeError: 'list' object has no attribute 'add'

他言語のadd()やpush()の感覚で書くと起きます。Pythonのリストへの要素追加はappend()です。

直し方: add を append にします。

この問題を解いてみる →

パターン3

 1  s = "  hi  "
 2  print(s.trim   ())
               ^
Traceback (most recent call last): File "main.py", line 2, in <module> print(s.trim()) ^^^^^^ AttributeError: 'str' object has no attribute 'trim'. Did you mean: 'strip'?

他言語のtrim()に慣れていると起きやすいミスです。Pythonで前後の空白を除去するのはstrip()です。

直し方: trim を strip にします。

この問題を解いてみる →

パターン4

 1  nums = [3, 1, 2]
 2  nums.reverse_order()
               ^
 3  print(nums)
Traceback (most recent call last): File "main.py", line 2, in <module> nums.reverse_order() ^^^^^^^^^^^^^^^^^^ AttributeError: 'list' object has no attribute 'reverse_order'

リストを逆順にするメソッドはreverse()です。組み込み関数reversed()とは別物で、リストのメソッドとしては存在しません。

直し方: reverse_order を reverse にします。

この問題を解いてみる →

パターン5

 1  text = "Hello World"
 2  print(text.lowercase  ())
                    ^
Traceback (most recent call last): File "main.py", line 2, in <module> print(text.lowercase()) ^^^^^^^^^^^^^^ AttributeError: 'str' object has no attribute 'lowercase'

他言語のtoLowerCase()やlowercaseの感覚で書くと起きます。Pythonの文字列を小文字化するメソッドはlower()です。

直し方: lowercase を lower にします。

この問題を解いてみる →

よくある誤解

似た名前のメソッドが存在すればPythonが候補を提示してくれますが、他言語の慣習をそのまま持ち込んだ場合(addやtrimなど)は候補が無く提示されません。

実務での勘所

Pythonは実行するまで属性やメソッドの存在を検査しません(動的型付け)。そのため、このタイプミスはコードを書いた時点では一切分からず、実際にそのメソッドを呼び出す行が実行されて初めて発覚します。テストでカバーされていない分岐に書いたタイプミスは、本番で該当処理が動くまで気づかれないことがあります。mypyのような型チェッカーと型ヒントを導入すると、実行前の静的な検査でこの種のミスの一部を検出できるようになります。

演習をはじめる

関連するエラー

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