概要
5年間ぐらいJavaでお仕事をしていて、現在はサーバーサイド言語としてPythonを使ってお仕事をしています。
まだ3ヶ月間なので全然慣れていませんが、そんなときにどういうことを思っていたのかということを備忘録として残しておきます。
self, clsを書く違和感
インスタンスメソッド, クラスメソッドを定義する際に、必ず第一引数にself
, cls
(名前はなんでもいいが慣例としてself, clsを使用)を書く必要があるという仕様について。
今まで書いていなかったのでやっぱり違和感ありますね~。
自分自身のインスタンスを表すという意味で、これはJavaで言うならthis
にあたると理解しています。
言語仕様として絶対にself
, cls
を書かなきゃいけないのであるなら、最初からthis
みたいに用意しておけばいいのに...って感覚ですね。
The Zen of PythonのExplicit is better than implicit.
の思想的に、自身を表す単語も明示的に書きましょう!っていう意図で言語設計されているんですかね
__init__.py
?
各パッケージにある__init__.py
ってなんだ?ってなりました。しかも基本的に中身空っぽだし。
調べてみてパッケージ化に必要なんだなぁとざっくり理解しました。
でも中身空っぽでもいいなら最初からなくても良くね?って思いました。
それに対する答えとして、Python3.3 以降なら空のものは不要ということが書かれていました。
古いバージョンのPythonでの開発の際は気をつける必要ありと、心に留めておきます。
__init__.pyを省略してはいけない
↑先輩社員から教えてもらいました!
名前空間パッケージと通常のパッケージは別物ということ。
通常のパッケージをディレクトリとして使う場合、目印として__init__.py
は必要だということを知りました。
__init__.py を置かなくても良いケースは複数の異なるパッケージとして配布しているものを一つの名前空間に紐付ける形で利用したい場合に使う機能
isの勘違い
a is b
といったようにPythonではis
で比較できるということで、「より英文っぽくなってかっこいい!」と思いましたし、可読性も良いので基本はこの書き方でいいのかと思って書いていて、見事に落とし穴にハマりました。
あるときis
を使った比較でTrueになると想定していたのにFalseが返り「???」となる事態が発生してプチハマり。
[python is] で検索するとすぐにisと==の違いといった内容の記事がヒットしました。
is
は同一性を比較していて、具体的にはオブジェクトが持つidを比較検証しているということでした。
一方で==
は値のみを比較検証しているということ。
a is b
はaのid == bのid
ということだったんですね
初心者がやりがちなミスでした。
pass文、意外に使う
何も実行しないpass文
。
こんなの使うタイミング滅多にないだろって思っていましたが、意外に書いちゃいますね。
とりあえずクラスとかメソッドとかを定義して中身どうするかを考える際に、エディタの静的コードチェックツールで怒られているのがなんとなく気になっちゃうので、一旦pass文を書くみたいな感じで使いがちです。
すぐ消すんですけどね。
アクセス修飾子ほしい
アクセス制限できたほうが大規模開発のときにより安全だからいいのになぁと思っています。
いくらアンダースコアがついているものはprivateだと言っても口約束ですからね。
ついつい例外的にここではOKとかにやっちゃいそう。
書き方についても違和感があります。
アンダースコアでプライベートかどうかを示すっていうのもやっぱり慣れません。
明示的にする思想っていうならclass
とかdef
とかの前にprivate
とかpublic
って書けたほうが明示的じゃね?って思っちゃいますね。
まあ注釈的な意味しか持たないし、他言語でもアンダースコアが使われているからそれでいいのか...
型は注釈にとどまるということに慣れない
Pythonは動的型付け言語ですが、型注釈の機能があり型を指定できます。
ただし注釈なのでコメントみたいなもの。
この感覚に最初は慣れませんでした。
特にOptional
ですね。
最初はOptional
ならifPresent
みたいなのがあって、かっこよく書けるだろって思ったのですが、実際はNoneかもしれないってことだけしか表現しないってところにちょっぴりがっかりしました
注釈なのでそりゃ当たり前だろって感じですよね。
結局if文でNoneチェックしないといけないって感じなんですね。
ただこれはtyping
のOptional
の話であって、それ以外でJavaのOptionalに似たモジュールはありました。
https://pypi.org/project/optional.py/
https://pypi.org/project/pyOptional/
型に自身のクラスを指定できない?
Factoryメソッドの戻り値の型注釈として自身のクラスを指定しようとしたら、未定義だと怒られました。
なにこれ?と思って調べてみたらそういう仕様だったということを知りました。
Python 3.7以降であればfrom __future__ import annotations
を書くことによって自身の型を指定でき、それより前のバージョンであるなら文字列でクラス名を記述することで指定できるとのこと。
Python 3.11からはtyping
でSelf
が使用できるのでそれも使える。
どっちにしろimportの必要なく自身のクラスを指定できたほうが直感的でわかりやすい気がしました。
https://stackoverflow.com/questions/33533148/how-do-i-type-hint-a-method-with-the-type-of-the-enclosing-class
いったんこのぐらい
現時点までのお仕事で思ったことを書き連ねました。
今後もバリバリPython書いていって、とりあえずPythonに慣れ親しんでいくことにします。
この備忘録を1年後に読んでみて、自分がどんなことを思うのかもちょっと楽しみです。