Code Fix

初級

.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)
               ^
Traceback (most recent call last): File "main.py", line 2, in <module> print(nums.length) ^^^^^^^^^^^ AttributeError: 'list' object has no attribute 'length'

リストの要素数はlen()という組み込み関数で取得します。他言語の.lengthや.size()のような書き方はPythonにはありません。

直し方: nums.length を len(nums) にします。

この問題を解いてみる →

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

パターン2

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

文字列の長さも同じくlen()です。他言語では文字列だけ.lengthのことがありますが、Pythonでは統一されています。

直し方: name.length を len(name) にします。

この問題を解いてみる →

パターン3

 1  d = {"a": 1}
 2  print(d.length )
              ^
Traceback (most recent call last): File "main.py", line 2, in <module> print(d.length) ^^^^^^^^ AttributeError: 'dict' object has no attribute 'length'

辞書の要素数もlen()で取得します。配列・文字列・辞書・集合など、Pythonのコレクションはすべてlen()で長さを揃えて扱えます。

直し方: d.length を len(d) にします。

この問題を解いてみる →

パターン4

 1  point = (1, 2, 3)
 2  print(point.length)
                ^
Traceback (most recent call last): File "main.py", line 2, in <module> print(point.length) ^^^^^^^^^^^^ AttributeError: 'tuple' object has no attribute 'length'

タプルの要素数もlen()で取得します。丸括弧か角括弧かに関わらず、規則は同じです。

直し方: point.length を len(point) にします。

この問題を解いてみる →

パターン5

 1  tags = {"a", "b", "c"}
 2  print(tags.length )
                ^
Traceback (most recent call last): File "main.py", line 2, in <module> print(tags.length) ^^^^^^^^^^^ AttributeError: 'set' object has no attribute 'length'

集合(set)の要素数も同様です。Pythonのコレクションは種類を問わずlen()に統一されています。

直し方: tags.length を len(tags) にします。

この問題を解いてみる →

よくある誤解

文字列だけ特別扱いだと思われがちですが、リスト・文字列・辞書・タプルなど、Pythonのコレクションはすべてlen()で長さを取得します。属性(.length)ではなく関数(len())である点が他言語との違いです。

実務での勘所

len()が関数として提供されているのは、Pythonの「一貫した窓口を1つ用意する」という設計思想の表れです。実装の裏側では、len(obj)はobj.__len__()という特殊メソッドを呼び出しているだけで、リスト・文字列・辞書・タプルはそれぞれ独自に__len__を実装しています。つまりlen()は、どんな型であっても「長さの数え方さえ教えてくれれば統一的な窓口で呼び出せる」というプロトコル(取り決め)であり、自分で作ったクラスに__len__を実装すれば、そのクラスのインスタンスもlen()に渡せるようになります。

演習をはじめる

関連するエラー

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