nikkie-ftnextの日記

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

読書ログ | #ミノ駆動本 7章「コレクション」の読書会予習に着手。Python関係のトピックがいくつか浮かびます!

はじめに

とっても大好き、略してTD1、nikkieです。

『良いコード/悪いコードで学ぶ設計入門』(通称ミノ駆動本)の読書ログです。
次回のミノ駆動本_読書pyに向けた、7章「コレクション」の予習ノートを公開します。

目次

7章「コレクション」

配列やループ処理を扱うのが7章!

7章目次

公開されている目次を引用します。

7 コレクション ―ネストを解消する構造化技法―

7.1 わざわざ自前でコレクション処理を実装してしまう
7.2 ループ処理中の条件分岐ネスト
7.3 低凝集なコレクション処理

一読して想起したPython関連の話題を書き出していきます。

自前実装、Pythonだったら?(7.1)

Pythonの組み込み関数、filtermapが浮かびました。

これらに関する発表として存在を思い出したのが、PyCon JP 2020の「関数型Pythonアンチパターン

  • スライドをざっと見たらfiltermap内包表記に置き換え!2
  • Effective Python 第2版』でも「項目27 mapやfilterの代わりにリスト内包表記を使う

また、ライブラリにあるけれど知らないばっかりに自前で実装してしまうケースについては

ファーストクラスコレクション in Python(7.3)

ミノ駆動本にもサンプルコードはありますが、増田本(『現場で役立つシステム設計の原則』)との合わせ技で盤石な印象です。
第1章の「複雑さを閉じ込める」でコレクションオブジェクト(=ファーストクラスコレクション)が紹介されます。

ファーストクラスコレクション自体は何回か実装したことがあり、便利さも感じていますが、どう実装するのがいいのかはこの機に振り返りたいところです。
最近はcollections.abc.Sequence4を継承して実装しています5

  • __len__メソッドの実装
  • __getitem__メソッドの実装

この2つの特殊メソッドを実装すると、for文で反復できるようになります6

「まだ答えを持っていないな〜」という点の1つが、スライスのサポート
__getitem__メソッドのkey引数は整数(int)の場合だけでなく、スライスの場合も考慮が必要です。
リストやタプルの動きを念頭に

  • key引数がintの場合は、その要素を返す(返り値はコレクションではない)
  • key引数がスライスの場合は、スライスが指す範囲の要素からなるコレクションを返す(返り値はいわば、部分コレクション)

で実装しています。
個人的にはこれでしっくり来ているのですが、他の実装も知りたいですね〜

命名について、『リーダブルコード』の3章(3.1)にあるのですが、filterよりはselectやexcludeのほうが誤解が少ないそうです。
そんなわけで、ファーストクラスコレクションのメソッドの命名にはselectやexcludeを使っています。

ジェネレータ

コレクションというトピック × Pythonで考えたいな〜と思ったのがジェネレータ
Pythonではジェネレータが一番メモリ効率がよいと理解しています7

Pythonでコレクションといったら組み込みのリスト(list)型が簡単に使えるのですが

のように、effectivenessを考えるとジェネレータに利があるという理解です。

ファーストクラスコレクション、メモリに展開せずにジェネレータとして実装できるのかな?
ちょっと考えてみたいです。

終わりに

ミノ駆動本 7章「コレクション」の読書会に向けた予習ノートでした。
Pythonで考えたいトピックとしては

  • 自前で実装に関連して
    • 内包表記
    • itertoolsやmore-itertools
  • ファーストクラスコレクションの実装
  • ジェネレータ

を挙げました。

P.S. 3/24(金) 7章「コレクション」のミノ駆動本_読書py!

次回ミノ駆動本_読書py(Python使い視点でミノ駆動本を読む、みんなのアウトプット中心の読書会)は3/24(金)、なんとラス2です!

このトピックに興味がある・知りたいという方や、Pythonでの経験豊富な方までどんな立場の方も大歓迎!
ぜひぜひお気軽にお越しください〜