抽象基本クラス (戦略パターンと呼ばれる) を使用して Python インターフェイスを実装しています。これを Pydantic で実行できるようにしたいと考えています。
Pydantic がなければ、次のようなプロパティを使用します。
from abc import ABC, abstractproperty
@dataclass
class PersonEntity(ABC):
@abstractproperty
def first_name(self):
raise NotImplementedError
@abstractproperty
def last_name(self):
raise NotImplementedError
@dataclass
class Person(PersonEntity):
@property
def first_name(self):
return 'Jimmy'
@property
def last_name(self):
return 'Kelly'
このように、次のような別のクラスを実装する場合
@dataclass
class SillyPerson(PersonEntity):
@property
def first_name(self):
return 'Jimmy'
@property
def last_name(self):
return 'Kelly'
@property
def sillyness(self):
return 5
その場合、インターフェイスはエラーをスローします。これは、 から継承する新しいクラスを制約するのに役立ちますPersonEntity
。
ただし、この情報を FastAPI 応答オブジェクトに吐き出したいのです。各プロパティ フィールドのすべての値と、プロパティ フィールドだけを取得する何らかのシリアライザーを考え出さないと、これを行うことはできません (これは苦労しています)。
私はむしろPydanticを使用したいと思います。この場合、プロパティは必要ありません。次のように簡単に実行できます。
from pydantic import BaseModel
class PersonEntity(ABC, BaseModel):
first_name: str
last_name: str
class Person(PersonEntity):
first_name: str
last_name: str
これらは必要な方法でシリアル化されますが、プロパティがなくなり、使用できないため、インターフェイス機能が失われます @abstractproperty
。
だから私が実装するなら
class SillyPerson(PersonEntity):
first_name: str
last_name: str
sillyness: str
pydantic がこれを許可しているため、エラーはありません。
(ちなみに、これらの例では、子クラスで BaseModel から継承するかどうかはわかりませんでした。)
PersonEntity
ABCクラスに含まれていないフィールドが導入されたときにエラーをスローして、必要なインターフェイス動作を提供するために Pydantic モデルを制約する方法はありますか?