0

抽象基本クラス (戦略パターンと呼ばれる) を使用して 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 から継承するかどうかはわかりませんでした。)

PersonEntityABCクラスに含まれていないフィールドが導入されたときにエラーをスローして、必要なインターフェイス動作を提供するために Pydantic モデルを制約する方法はありますか?

4

0 に答える 0