内部実装を読んで理解する『len()関数がオブジェクトの長さを手にいれる仕組み』 #pyconjp #pyconjp_203

len()関数がオブジェクトの長さを手にいれる仕組み Takayuki Shimizukawa @shimizukawa Pythonには文字列やリストなど、長さをもつオブジェクトがあります。長さを手に入れるには、文字列なら、name.length ではなく len(name) のようにlen関数を使います。len関数はどうやってnameに入っているオブジェクトの長さを手に入れているのでしょうか。if文にはTrue/Falseとなる条件式を指定しますが、それだけでなく文字や数字、自分で作ったデータ型も渡せます。if文はどうやって与えられたオブジェクトがTrueなのかFalseなのかを手に入れているのでしょうか。 この発表では、Pythonのプログラムがどうやって必要な情報を手に入れているのか、また、自分で実装するときにどう実装すればlen()やif文やfor文に指定できるのかを説明します。
5
くーむ@( o・ω・)ノ @cocodrips

実装された__len__がきちんとintを返しているかどうかをlen()は確認している #pyconjp_203

2017-09-08 14:09:30
ミヒャエル@療養中 @mihyaeru21

唐辛子マークがちょっとずつ伸びていっているw #pyconjp_203

2017-09-08 14:09:33
うさたーん @usaturn

右上の唐辛子の細かい挙動で笑いをとる shimizkawa センセー #pyconjp #pyconjp2017_203

2017-09-08 14:09:41
susumuis/いしがみプロ @susumuis

object.length()でいいんじゃないの? __len__()がint以外を返すとlen(obj)はTypeErrorを返す! #pyconjp_203

2017-09-08 14:09:51
npub1hqmrddql4em63chfs02x8cx86alrdss9m4kxevpjzwwgc @ryu22e

len関数の中でオブジェクトの__len__メソッドを呼んでいる。さらに、__len__メソッドの返り値の型チェックもやっている #PyConJP #pyconjp_203

2017-09-08 14:10:29
くーむ@( o・ω・)ノ @cocodrips

__len__を書き換えた場合にちゃんとintがかえってくるって保証ができないから、obj.__len__じゃなくてlen(obj)でアクセスするのかな #pyconjp_203

2017-09-08 14:10:41
ミヒャエル@療養中 @mihyaeru21

TypeError: __len__() should return an int になるのかー! #pyconjp_203

2017-09-08 14:11:16
ヨーシャ(Iosif Takakura)💙💛 @huideyeren

実はlen関数は型と値をチェックしている。Adapterパターンなのかー。 #pyconjp_203

2017-09-08 14:11:18
麻木浅葱 / ARメタバース @asagi_00a3af

#pyconjp #pyconjp_203 ほーん。len()は__len__を読みに行っているだけなので数値を返す__len__を実装すれば独自クラスでもlen()に対応できるし、変な値を返すこともできるw

2017-09-08 14:13:45
Λlisue @lambdalisue

python が len 関数使うのは歴史的事情だと思うけどね。今は length をプロパティにすることも簡単に厳密に出来るけど、今更変えられないよね #pyconjp_203

2017-09-08 14:14:55
npub1hqmrddql4em63chfs02x8cx86alrdss9m4kxevpjzwwgc @ryu22e

「Protocol」という言葉はPython公式ドキュメントに何度も出て来るが、定義の一覧はどこにもなさそう #PyConJP #pyconjp_203

2017-09-08 14:15:03
SHIMIZU Taku @takuan_osho

とりあえず今やっている説明だけでlv1はないなwと思いつつ、ためになる話で後で復習したい #pyconjp #pyconjp_203

2017-09-08 14:15:10
susumuis/いしがみプロ @susumuis

protocol とは公式ドキュメントにも書いてある。Python2.2で初登場、protocol一覧というものはない。 PEP-544でPEPにも初登場 #pyconjp_203

2017-09-08 14:15:18
くーむ@( o・ω・)ノ @cocodrips

プロトコル一覧をみるには、corrections.abc(抽象基底クラス)のとこみるのが良さそう #pyconjp_203

2017-09-08 14:16:09
matoba @mtb_beta

#pyconjp_203 注意:まだトウガラシ一つ

2017-09-08 14:16:23
ヨーシャ(Iosif Takakura)💙💛 @huideyeren

組み込み関数にすることで、メソッドとして実装するよりコードを減らせるのか。 #pyconjp_203

2017-09-08 14:16:44
くーむ@( o・ω・)ノ @cocodrips

len(), min(), max() ... 等によって__len__とかの実装コストを下げている #pyconjp_203

2017-09-08 14:16:53
matoba @mtb_beta

#pyconjp_203 トウガラシ二つにレベルアップ

2017-09-08 14:16:59
うさたーん @usaturn

「ここまで唐辛子1個でしたけど」さっき唐辛子2個のところあったよ #pyconjp #pyconjp_203

2017-09-08 14:16:59
Hiroshi Sano @hrs_sano645

Adapter patternでプロトコルに沿って実行されているlen() #pyconjp_203

2017-09-08 14:17:28