はじめに
異議あり! nikkieです。
『ロバストPython』を読み始めました。
将来の開発者に意図を伝えるPythonの書き方が指南された(議論のための)本です。
10章クラスは著者(Patrickさん)の想いが込められた章とお見受けしますが、私としても議論したい話題があります。
目次
- はじめに
- 目次
- 前回の『ロバストPython』10章!
- 1. 不変式を保つために例外送出。アサーションか例外か
- 2. カプセル化に関して、プライベートな属性推奨。本当に?
- 3. クラスとデータクラスの用途分け
- 終わりに
前回の『ロバストPython』10章!
議論する前に、10章を読んでの理解をまとめました。
クラスのキーワードは不変式(Invariants)。
意味は、インスタンスが必ず持つ性質を伝えるもの。
実装にクラスを選択するかは不変式があるかどうかで判断、というのが筆者の主張と理解しています。
では、議論(ガチバトル)したいことを書き出していきましょう。
なお、この記事ではバトルはしません。
別の記事で三番勝負が予定されています。
1. 不変式を保つために例外送出。アサーションか例外か
__init__
の実装について、不変式が満たされなければ例外を送出するテクニックが紹介されます(10.2.1)。
例外を送出する考えには同意ですが、その方法には「異議あり!」です。
- 著者(Patrickさん)の主張:
assert
文アサーションは、開発者の頭が混乱しない限り満たされるはずだと予想される条件に対して使う
- nikkieの主張:例外送出しては?(例えば
ValueError
)
議論するポイントとしては以下が浮かんでいます。
- そもそもnikkieはPatrickさんの前提を理解できていない可能性がある
- このクラスの利用者は開発者だけということなのだろうか?
- assertだと何が問題か。無効化できる
2. カプセル化に関して、プライベートな属性推奨。本当に?
不変式を維持するためにカプセル化が必要と主張されます(10.3.1)。
不変式維持の重要性は理解できるのですが、この実装方法に「異議あり!」です。
- 著者(Patrickさん)の主張:プライベートな属性
- アンダースコア2つで始めて、名前マングリング
- nikkieのもやっとポイント:『Effective Python』と真逆のこと言ってる...
項目42 プライベート属性よりパブリックな属性が好ましい
2つの主張は相容れない(まさに矛盾!)ように思われるので、『Effective Python』の方を確認して考えてみたいと思います。
著者のパネルディスカッションとかPyConでやらないかな〜2
3. クラスとデータクラスの用途分け
10章を少しはみ出ますが、もう1つ。
9章でデータクラスが紹介されます(@dataclasses.dataclass
を使って定義されるクラスです)。
著者(Patrickさん)はクラスとデータクラスの用途を明確に分けています(10.4。特に図10-1)。
すなわち、異種コレクション3で
- 不変式がなければ、データクラス
- 不変式があれば、クラス
まとめた上で意見をぶつけます
- 著者(Patrickさん)の主張:不変式の有無でクラスとデータクラスを使い分けよう
- nikkieの意見:そんなに明確に使い分けられる?
@dataclasses.dataclass
を使って不変式を持ったクラスを作ってもいいんじゃないか
議論するポイントを書き出します。
@dataclasses.dataclass
ってクラス定義のシンタックスシュガーという認識(裏はとっていません)- クラス定義の記述量が減るからガンガン使っていこうぜとnikkieは考えている
- 関連エントリ:dataclassデコレータを使ったクラスが #ミノ駆動本 でいう「データクラス」になるかは、プログラマ次第 - nikkie-ftnextの日記
- はっきりさせるためにまずデータクラスの提案PEPを読んでみたい
- シンタックスシュガーという私の認識が間違っている可能性は全然あります
終わりに
『ロバストPython』10章で議論したいポイントを書き出しました。
第1期名蛇戦 三番勝負はこの春開幕です4。
各論点について結論は出るのか(決めきれないもあると思います)、調べてみたら返り討ちにあうのか、nikkieは主張の妥当性を示しきれるのか、お楽しみに〜
おーい、『ロバストPython』、議論(ガチバトル)しようぜ〜
Pythonに一家言ある皆さまのご乱入もお待ちしています(コメントとか@ftnext宛にお便りとかください)
やっぱり読書会があるとよさそうな本だと思います〜(どなたかご一緒しませんか〜?📣)
- 書籍の監訳注にもありますし、ドキュメントでは https://docs.python.org/ja/3/using/cmdline.html#cmdoption-O です↩
- マジで名人戦ですね↩
- 5章で導入される概念です👉読書ログ | 『ロバストPython』5章「コレクション型」を読んで、コレクション(listやdictなどなど)への型ヒントの書き方や、振る舞いの拡張の仕方を完全に理解しました - nikkie-ftnextの日記↩
-
名人戦は明日開幕。こっちもガチバトル!
↩5日に開幕する第81期 #名人戦 。#藤井聡太 王将(20)が、谷川浩司十七世名人の持つ名人獲得の最年少記録の更新と7冠達成を懸け、#渡辺明 名人(38)に挑戦します。写真は前夜祭で花束を受け取り笑顔を見せる渡辺明名人(右)と挑戦者の藤井聡太王将。
— 毎日新聞写真部 (@mainichiphoto) 2023年4月4日
写真特集 https://t.co/YBiGKxeDGq pic.twitter.com/V1MsA5BTYJ