Python の len() について

Python の初学者は len() でコレクションのサイズを取ることについて違和感を覚えるかもしれない。Python では [1, 2, 3].length ではなく len([1, 2, 3]) でリストのサイズを取るのはなぜだろう。

この問いに対する答えを二つ紹介しよう。

.size() や .length() などのゆらぎと無縁

クラスごとにサイズを取得するメソッドを定義するとしよう。その場合、ある設計者は .size() というメソッドを作るかもしれないし、別な設計者は .length() というメソッドにするかもしれない。もしくは sizelength というプロパティを作るかもしれない。

オブジェクトごとに異なるサイズの取得方法があるというのは混乱の元である。

ユーザ定義クラスと組み込みクラスの透過性

list や str などの組み込みクラスに対する len() は C の PyVarObject 構造体から ob_size を読むことで実現される。単なるデータの読み出しなので、高速だ。

一方、ユーザ定義クラスに対する len() は オブジェクトの __len__() メソッド呼び出しで実現される。つまり、クラス定義の中で __len__() さえ実装してしまえば、組み込みクラスと同様の手段でサイズを取得することができる。

まとめ

メソッド名のゆらぎがなく、組み込みクラスとユーザ定義クラスの区別なくサイズを取得できるという意味で、Python の len() の実装は優れている。

参考資料

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中