「データクラス」への期待

これの続き。

Pythonのdictは柔軟で扱いやすいが、一方で値の型が把握しづらい(注1)。他人が書いたコードは言わずもがな、自分の書いたそれもすぐ忘れて「?」となる。またその入れ子やら新たなキーの追加や削除やらも容易だが、こういうの(注2)をやりだすと状況は更に悪化する。Cの構造体のようなカッチリとしたデータ構造を記述するにはどうしたら良いのか? Python3.7から導入された「データクラス」は、そうした要望に対する回答のひとつである。

何よりdictではできない「継承」が使えるだけでも有り難い。実をいうとその存在に気づくまで、俺は通常のクラスでこれをやっていた。そういう意味では「データクラス=データ保持に特化したクラス」と捉えて差し支えない(注3)が、便利な機能が多数盛り込まれているので「これからは遍くこれで」と考えている。

惜しいかな現時点ではクラス変数に不正な型を代入しても動いてしまうし、PyCharmでも警告が出ない。が、これらが実現されるのはそう遠い先の事ではないと思う。尤もそうなるともはやPythonは「動的片付き言語」と呼べなくなるのでは? だが、俺的にはその方がずっといい。

注1: 変数では有効なtypehintがdictのキーには使えない
注2: Pythonに限った話ではなくPHPとかJavascriptとかも同様である
注3: 実際データクラスはclassへのデコレータで記述する

型あるものいつかは助かる

このワタクシも「アセンブラで育ちCで稼いだ世代」なもので最初は「動的片付き言語」が苦手だった。が食うに困って何事も勉強とPHPとかJavascriptとかを使うようになって以来「アレはアレ、コレはコレ」という切り分けができるようになって幾年月、ここ暫くはPythonにすっかり軸足が移っている。ちょいプロにはこれが最適である。

だがその規模が大きくなってくるとやはり「前に自分の書いたコードが理解できない」というクライシスにしばしば陥る。またそうなると、変数や関数の型が曖昧なところが更なる混乱を招く。

そこである時期から変数の定義にはtypehintを、関数の定義にはキーワード引数をと心掛けるようになって状況は大きく改善した。尤もそれらはPythonのというよりむしろ「Pycharmの助け」あってというところだが、結果良ければ全て良しである。なので以前に書いたコードを片っ端からこれらで書き換えた = ここまでは意図したとおりだった … が、ひとつ面倒なやつが残った。

dp = {
    'name': 'sekitakovich',
    'age': 18,
    'valid': True,
    'at': dt.now(),
}

こういうCのstructure的な書き方をしている部分が綺麗に書けなくて困っていたんだが、Python3.7のドキュメントで目にした「dataclasses」なるキーワードからこれが一気に氷解した。

# 詳細については改めて!