nikkie-ftnextの日記

イベントレポートや読書メモを発信

『ロバストPython』10章クラス、私はここを議論したい!(議論三番勝負はこの春開幕です)

はじめに

異議あり nikkieです。

ロバストPython』を読み始めました。
将来の開発者に意図を伝えるPythonの書き方が指南された(議論のための)本です。
10章クラスは著者(Patrickさん)の想いが込められた章とお見受けしますが、私としても議論したい話題があります。

目次

前回の『ロバストPython』10章!

議論する前に、10章を読んでの理解をまとめました。

クラスのキーワードは不変式(Invariants)。
意味は、インスタンスが必ず持つ性質を伝えるもの。

実装にクラスを選択するかは不変式があるかどうかで判断、というのが筆者の主張と理解しています。

では、議論(ガチバトル)したいことを書き出していきましょう。
なお、この記事ではバトルはしません。
別の記事で三番勝負が予定されています。

1. 不変式を保つために例外送出。アサーションか例外か

__init__の実装について、不変式が満たされなければ例外を送出するテクニックが紹介されます(10.2.1)。
例外を送出する考えには同意ですが、その方法には「異議あり!」です。

  • 著者(Patrickさん)の主張:assert
    • アサーションは、開発者の頭が混乱しない限り満たされるはずだと予想される条件に対して使う

  • nikkieの主張:例外送出しては?(例えばValueError

議論するポイントとしては以下が浮かんでいます。

  • そもそもnikkieはPatrickさんの前提を理解できていない可能性がある
    • このクラスの利用者は開発者だけということなのだろうか?
  • assertだと何が問題か。無効化できる
    • python -O でassertを捨てられる1
    • Pythonトリック』 2.1 アサーションによる安全対策
    • t-wadaさんがPHPで発表されている(積ん読
      • slide=122などを見て、assertの使い所として適切かを考えたい
      • (今の私は、起こり得ることだからassertは向かず、例外のほうが適切ではないかと考えている)
    • t-wadaさんも引いているし、Patrickさんも読んでいるっぽい『達人プログラマー』も確認したい

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を使って不変式を持ったクラスを作ってもいいんじゃないか

議論するポイントを書き出します。

終わりに

ロバストPython』10章で議論したいポイントを書き出しました。
第1期名蛇戦 三番勝負はこの春開幕です4
各論点について結論は出るのか(決めきれないもあると思います)、調べてみたら返り討ちにあうのか、nikkieは主張の妥当性を示しきれるのか、お楽しみに〜

おーい、『ロバストPython』、議論(ガチバトル)しようぜ〜
Pythonに一家言ある皆さまのご乱入もお待ちしています(コメントとか@ftnext宛にお便りとかください)

やっぱり読書会があるとよさそうな本だと思います〜(どなたかご一緒しませんか〜?📣)


  1. 書籍の監訳注にもありますし、ドキュメントでは https://docs.python.org/ja/3/using/cmdline.html#cmdoption-O です
  2. マジで名人戦ですね
  3. 5章で導入される概念です👉読書ログ | 『ロバストPython』5章「コレクション型」を読んで、コレクション(listやdictなどなど)への型ヒントの書き方や、振る舞いの拡張の仕方を完全に理解しました - nikkie-ftnextの日記
  4. 名人戦は明日開幕。こっちもガチバトル!