PythonのUserList型が便利だったので紹介
前提
FCCとは
- https://zenn.dev/yuyu_hf/articles/93ba0a734208b3
- https://engineering.dena.com/blog/2016/12/first-class-collection/
UserList
collectionsモジュールの一つ https://docs.python.org/ja/3.13/library/collections.html 組み込みのlist型を拡張することができるクラス。
例えば以下のように定義すると、FCCとして作ったクラスを普通のlistのように使える。
import collections
@dataclass(frozen=True)
class ExecutionResult:
pass
class ExecutionResults(collections.UserList[ExecutionResult]):
def is_all_valid(self):
pass
results = ExecutionResults()
results.append(usecase1.exec())
results.append(usecase2.exec())
if results.is_all_valid():
print("SUCCESS!")dataclassでもFCCは書けるが、Classの中のlistに対して操作をしていくのでUserListよりダイレクト感がない
@dataclass(frozen=True)
class ExecutionResult:
pass
@dataclass
class ExecutionResults:
values: list[ExecutionResult]
def append(self v: ExecutionResult):
self.values.append(v)
def is_all_valid(self):
pass
results = ExecutionResults([])
result.append(usecase1.exec())
result.append(usecase2.exec())
if results.is_all_valid():
print("SUCCESS!")ちなみにUserDict、UserStringもある。 ただUserDictを使うくらいならdataclassを使った方がいいのでは?という気もする
Robust Python - Patrick Viaforeでも紹介されているが、list型を直接継承すると思わぬ挙動をしたりする(組み込みlistのインライン定義周りなど)ので、UserListを継承するのが無難らしい