きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Pythonの__iter__を素振りする(First Class Collection[FCC]で使えるかも)

Pythonではイテレータを簡単に作れます。もしかしたら何かに使えるかもしれないので、素振りします。

環境

  • Python
    • 3.12

ゴール

PythonのFCC(First Class Collection)にて、For文を使用する際にFCCのインスタンスのまま使用できること。

from typing import List

class User():
  # ... 省略

class Users():
  value: List[User]

  # コンストラクタ省略


users = Users([])
# この記載ができることがゴール
[user for user in users]
# ※ もちろん、対応前でも値を取得すれば元の通りにアクセスできます。
[user for user in users.value]

実装

iterメソッドか、yield fromで内部の値にアクセスすることで、外側からは意識せずともFor文で使用できます。

from typing import List, Iterable

class Users():
  value: List[User]

  def __iter__(self) -> Iterable[User]:
    # イテレータプロトコルを実装する
    return iter(self.value)
    # yield from でListのイテレータを呼ぶこともできる
    yield from self.value

ソースコード

終わりに

頭に良い人ならもうちょっと面白い使い方ができそうなのですが、今の私ではFCCを使用する際に記載量を減らせる、というくらいにしか使え無さそうでした。

Pythonで型を意識するような書き方自体が微妙かもしれませんが、ライブラリが優秀なおかげで他言語と遜色ない処理が色々とできますし、しばらくの期間はPythonを使い倒せるようにしたいですね。