TechFeed Conference 2022 Pick up

Pythonに上級テクニックは要らない(そして正しい付き合い方)~TechFeed Conference 2022講演より

本記事は、2022年5月に開催されたTechFeed Conference 2022のセッション書き起こし記事「Pythonに上級テクニックは要らない(そして正しい付き合い方)⁠清原弘貴⁠⁠ — TechFeed Conference 2022講演より」を転載したものです。オリジナルはTechFeedをご覧ください。

Pythonに上級テクニックは要らない、そして正しい付き合い方ということで発表します、清原です。

株式会社ゼンプロダクツというのを最近立ち上げまして、日本語を書けばAIが文章を校正してくれる、Shodoというサービスを本気で作っています。Markdownでも書けて、はてなブログに配信できたりもするので、ぜひテック記事にも使ってください。

Python歴11年、DjangoCongress JP代表5年目で今年もやりますので、よろしくお願いします。

テック記事、読むならTechFeed、書くならShodoということでお願いします。

テック記事、読むならTechFeed、書くならShodo

Pythonの上級テクニック…使いたくなるその前に

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

Pythonの上級とされるものの数々だが…
Pythonの上級とされるものの数々だが…

テクニックは積極的に学び、使っていくべきだと僕は思っています。それで皆さん聞いてくれていると思うんですけれども、過剰に手を染めすぎたり凝りすぎると正直ちょっと微妙なところもありまして、可読性やメンテナンス性が低くなることもあります。

なぜこの話をするかというと、テクニックを学んで凝りだしたくらいの時期、初心者を脱して頑張っていくぞ!となっている時期は、そのテクニックをプロダクトコードで使って大失敗をしがち…みたいなことがあります。なので、そういう人に聞いてほしいなと思い、この話をすることにしました。

テクニックとは何か

Zen
テクニックは基本的に必要ないはず

テクニックとはなにかについて、考えてみました。Pythonの人なのでZenを考えちゃうんですね。

実はテクニックは基本的に必要ないはずなんですよ。なぜかというと、要件に合わせた意図をプログラムという形で読みやすく記述できればそれで済むんですよ。だからテクニックというものは、ちゃんと隠蔽されているべきものであって、書こうとする人はそんなに気にせず使えるべきものだと僕は考えています。

たとえばprint("Hello")というコードがあって、Helloって表示するだけなんですけども、このprint("Hello")にクラスを使おうだの、型定義がうんぬん…というのは必要ないじゃないですか。Pythonってゆるふわ言語なので。でも後ろの世界には素晴らしいテクニックがあって、それが隠蔽されているはずなんですよね。そういうものじゃないですか。

テクニックを使いたいというのは結局のところ、より高度なことをしたいからなんです。たとえば、再利用性を高めてプロジェクト内で多くの人にコンポーネントを使ってもらうとか、保守性を高めたり、可読性を高めたり、プログラムの応答性を高めたり、遅延評価させるようにしたり…こういうことをしたいからテクニックを使っていく、そういうわけなんですよ。

テクニックを使うのは、より高度なことをしたいから

だからテクニックっていうのはフォースの力なんじゃないかなと僕は思うんですよね。常に学んで実験したり、自分の中でサンドボックスで頑張って勉強したりしたうえで実践の場で使っていくべきで、力に飲み込まれないように注意したいですね。

使うときと作るときは違って、たとえばpandasでdf[df["age"] == 30]と書いたときに、30という数値の行を取ってくるコードなんですが、これPythonの人的にはマジでわけがわからないことができてるんですね。これを使えるということは大事なんですけれども、このdfクラスを作れるということは、実は多くの人に取っては必要ないんです。

使うときと作るときは違う

テクニックの使いどころ

多くの人にとって必要な力、そのテクニックは、どんなときにどれくらい使うべきなのかという話をしていきたいと思います。

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

テクニックは用いる場が重要

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

テクニックを星5つで分類
テクニックを星5つで分類:注意

これは私の意見ですので人により違いはあります。また、テクニックを使ったなにか(たとえばライブラリなど)を使う側は言われたとおりに書けばいいと思いますので、そうではなくて難しいテクニックを自分が使おうというときの話をします。

★☆☆☆☆: 手元のコードでもガンガン使っていいテクニック

たとえばリスト内包表記やyield / yield from、型ヒントなどは、もうどんどん書いていけばいいと思います。

星1つ:手元のコードでもガンガン使っていいテクニック

★★☆☆☆: 手元のコードで書いてもいいけど、あまりやりすぎるとちょっと微妙で、先輩社員に相談したほうがいいテクニック

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

星2つ:やりすぎるとちょっと微妙

★★★☆☆: 中級/上級であればプロジェクト内で相談して使っていくテクニック

継承を前提とした基底クラスを書いたり、iter / next / enter / __call__あたりを実装するもの、エラークラスを定義してそのエラーが投げられたときどうこうしますよ、というのはもうちょっと上かなと思います。

星3つ:中級/上級向き

★★★★☆: 仕事で難しい要件が来たときのテクニック

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

星4つ:プロジェクト内でちょっと複雑なことがしたいときに

★★★★★: 基本的に使わない

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

星5つ:正直使わないでほしい

まとめ

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

テクニックは積極的に学ぶべき、でもいらないでいい
Simple is better than complex

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

おすすめ記事

記事・ニュース一覧