メソッド名のタイプミスで出る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 ()) ^
メソッド名の綴りミスです。似た名前のメソッドが存在する場合はPythonが候補を提示してくれます。
直し方: uper を upper にします。
パターン2
1 nums = [1, 2, 3] 2 nums.add (4) ^ 3 print(nums)
他言語のadd()やpush()の感覚で書くと起きます。Pythonのリストへの要素追加はappend()です。
直し方: add を append にします。
パターン3
1 s = " hi " 2 print(s.trim ()) ^
他言語のtrim()に慣れていると起きやすいミスです。Pythonで前後の空白を除去するのはstrip()です。
直し方: trim を strip にします。
パターン4
1 nums = [3, 1, 2] 2 nums.reverse_order() ^ 3 print(nums)
リストを逆順にするメソッドはreverse()です。組み込み関数reversed()とは別物で、リストのメソッドとしては存在しません。
直し方: reverse_order を reverse にします。
パターン5
1 text = "Hello World" 2 print(text.lowercase ()) ^
他言語のtoLowerCase()やlowercaseの感覚で書くと起きます。Pythonの文字列を小文字化するメソッドはlower()です。
直し方: lowercase を lower にします。
よくある誤解
似た名前のメソッドが存在すればPythonが候補を提示してくれますが、他言語の慣習をそのまま持ち込んだ場合(addやtrimなど)は候補が無く提示されません。
実務での勘所
Pythonは実行するまで属性やメソッドの存在を検査しません(動的型付け)。そのため、このタイプミスはコードを書いた時点では一切分からず、実際にそのメソッドを呼び出す行が実行されて初めて発覚します。テストでカバーされていない分岐に書いたタイプミスは、本番で該当処理が動くまで気づかれないことがあります。mypyのような型チェッカーと型ヒントを導入すると、実行前の静的な検査でこの種のミスの一部を検出できるようになります。