本セッションの登壇者
セッション動画(YouTubeチャンネル登録もお願いします。)
Pythonに上級テクニックは要らない、そして正しい付き合い方ということで発表します、清原です。
株式会社ゼンプロダクツというのを最近立ち上げまして、日本語を書けばAIが文章を校正してくれる、Shodoというサービスを本気で作っています。Markdownでも書けて、はてなブログに配信できたりもするので、ぜひテック記事にも使ってください。
Python歴11年、DjangoCongress JP代表5年目で今年もやりますので、よろしくお願いします。
テック記事、読むならTechFeed、書くならShodoということでお願いします。

Pythonの上級テクニック…使いたくなるその前に
Pythonの上級テクニックという枠でお話するのですが、デコレータやContext Managerからはじまり、メタクラスとかattrsとか、ややこしいのがありますけれども、ちょっと待ってください。

テクニックは積極的に学び、使っていくべきだと僕は思っています。それで皆さん聞いてくれていると思うんですけれども、過剰に手を染めすぎたり凝りすぎると正直ちょっと微妙なところもありまして、可読性やメンテナンス性が低くなることもあります。
なぜこの話をするかというと、テクニックを学んで凝りだしたくらいの時期、初心者を脱して頑張っていくぞ!となっている時期は、そのテクニックをプロダクトコードで使って大失敗をしがち…みたいなことがあります。なので、そういう人に聞いてほしいなと思い、この話をすることにしました。
テクニックとは何か


テクニックとはなにかについて、考えてみました。Pythonの人なのでZenを考えちゃうんですね。
実はテクニックは基本的に必要ないはずなんですよ。なぜかというと、要件に合わせた意図をプログラムという形で読みやすく記述できればそれで済むんですよ。だからテクニックというものは、ちゃんと隠蔽されているべきものであって、書こうとする人はそんなに気にせず使えるべきものだと僕は考えています。
たとえばprint("Hello")というコードがあって、Helloって表示するだけなんですけども、このprint("Hello")にクラスを使おうだの、型定義がうんぬん…というのは必要ないじゃないですか。Pythonってゆるふわ言語なので。でも後ろの世界には素晴らしいテクニックがあって、それが隠蔽されているはずなんですよね。そういうものじゃないですか。
テクニックを使いたいというのは結局のところ、より高度なことをしたいからなんです。たとえば、再利用性を高めてプロジェクト内で多くの人にコンポーネントを使ってもらうとか、保守性を高めたり、可読性を高めたり、プログラムの応答性を高めたり、遅延評価させるようにしたり…こういうことをしたいからテクニックを使っていく、そういうわけなんですよ。

だからテクニックっていうのはフォースの力なんじゃないかなと僕は思うんですよね。常に学んで実験したり、自分の中でサンドボックスで頑張って勉強したりしたうえで実践の場で使っていくべきで、力に飲み込まれないように注意したいですね。
使うときと作るときは違って、たとえばpandasで
’df[df["age"] == 30]
と書いたときに、30という数値の行を取ってくるコードなんですが、これPythonの人的にはマジでわけがわからないことができてるんですね。これを使えるということは大事なんですけれども、このdfクラスを作れるということは、実は多くの人に取っては必要ないんです。

テクニックの使いどころ
多くの人にとって必要な力、そのテクニックは、どんなときにどれくらい使うべきなのかという話をしていきたいと思います。
テクニックは用いる場が重要です。手元のプログラムをアサインされてやる場合と、チーム全体で考えてプロジェクト内で書いていくのと、ライブラリ/フレームワークをもっと世界中の人たちが使いやすいように作りたいというのでは違うのかなと思っています。

Pythonにあるちょっと難しそうなテクニックを星5つで分類して紹介していきますので、この力(テクニック)を使いたいと思ったときに参考にしてください。


これは私の意見ですので人により違いはあります。また、テクニックを使ったなにか(たとえばライブラリなど)を使う側は言われたとおりに書けばいいと思いますので、そうではなくて難しいテクニックを自分が使おうというときの話をします。
★☆☆☆☆: 手元のコードでもガンガン使っていいテクニック
たとえばリスト内包表記やyield / yield from、型ヒントなどは、もうどんどん書いていけばいいと思います。

★★☆☆☆: 手元のコードで書いてもいいけど、あまりやりすぎるとちょっと微妙で、先輩社員に相談したほうがいいテクニック
classをあまり定義しすぎるのは微妙かなと思っていて、たとえばdict / tupleでまかなえるならそのほうがテストも書きやすいです。decoratorもあまり書きすぎるとファットなものができてしまって微妙だったりします。なのでそのあたりはちょっと先輩社員と相談したほうがいいかなと思います。globalとかlocalはあまり使わないほうがいいかなと思います。

★★★☆☆: 中級/上級であればプロジェクト内で相談して使っていくテクニック
継承を前提とした基底クラスを書いたり、iter / next / enter / __call__あたりを実装するもの、エラークラスを定義してそのエラーが投げられたときどうこうしますよ、というのはもうちょっと上かなと思います。

★★★★☆: 仕事で難しい要件が来たときのテクニック
Mixinとかattr.sとか@my_property.setterとかはそんなに使わなくていいと思っています。動的インポートもコードがけっこうむちゃくちゃになりがちなので、プロジェクト内でちょっと複雑なことがしたいときに使ってほしい感じがします。

★★★★★: 基本的に使わない
メタクラスやabcなどは正直使わないでほしいというところです。使いたいなと思ったらちょっと疑ってください。__getattr__のオーバーライドとかも微妙なところがけっこう大きい。sliceオブジェクトを使ってどうのこうのしたい(既存のスライスと違った動作をさせる)というのも、そんなにやることはないかと思いますので、フレームワークを作りたいとき程度に考えたほうがいいと思います。

まとめ
テクニックは積極的に学ぶべきですけども、いらないならいらないでいいと思います。Simple is better than complexというPythonのいい言葉があります。


そんなわけで、読むならTechFeed、書くならShodoということでよろしくお願いします。ありがとうございました。