.lengthではなくlen()を使う理由という原因と直し方
他言語の.lengthや.size()の感覚でPythonのコレクションを扱おうとしたときに出るエラーです。Pythonでは長さの取得はlen()という組み込み関数に統一されています。
エラーメッセージの読み方
Traceback (most recent call last):
main.py- ファイル名
2- 行番号 — 実際にクラッシュした行
<module>- 発生場所 — <module> ならトップレベル、関数名ならその関数の中
AttributeError- 例外クラス — 何が起きたか。ここを検索するのが最短です
'list' object has no attribute 'length'- 詳細メッセージ — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 nums = [1, 2, 3] 2 print(nums.length) ^
リストの要素数はlen()という組み込み関数で取得します。他言語の.lengthや.size()のような書き方はPythonにはありません。
直し方: nums.length を len(nums) にします。
パターン2
1 name = "hello" 2 print(name.length) ^
文字列の長さも同じくlen()です。他言語では文字列だけ.lengthのことがありますが、Pythonでは統一されています。
直し方: name.length を len(name) にします。
パターン3
1 d = {"a": 1} 2 print(d.length ) ^
辞書の要素数もlen()で取得します。配列・文字列・辞書・集合など、Pythonのコレクションはすべてlen()で長さを揃えて扱えます。
直し方: d.length を len(d) にします。
パターン4
1 point = (1, 2, 3) 2 print(point.length) ^
タプルの要素数もlen()で取得します。丸括弧か角括弧かに関わらず、規則は同じです。
直し方: point.length を len(point) にします。
パターン5
1 tags = {"a", "b", "c"} 2 print(tags.length ) ^
集合(set)の要素数も同様です。Pythonのコレクションは種類を問わずlen()に統一されています。
直し方: tags.length を len(tags) にします。
よくある誤解
文字列だけ特別扱いだと思われがちですが、リスト・文字列・辞書・タプルなど、Pythonのコレクションはすべてlen()で長さを取得します。属性(.length)ではなく関数(len())である点が他言語との違いです。
実務での勘所
len()が関数として提供されているのは、Pythonの「一貫した窓口を1つ用意する」という設計思想の表れです。実装の裏側では、len(obj)はobj.__len__()という特殊メソッドを呼び出しているだけで、リスト・文字列・辞書・タプルはそれぞれ独自に__len__を実装しています。つまりlen()は、どんな型であっても「長さの数え方さえ教えてくれれば統一的な窓口で呼び出せる」というプロトコル(取り決め)であり、自分で作ったクラスに__len__を実装すれば、そのクラスのインスタンスもlen()に渡せるようになります。