PythonのUserList型が便利だったので紹介

前提

FCCとは

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を継承するのが無難らしい