Двойная базовая модель Python Pydantic

Я использую FastAPI с Pydantic, и я пытаюсь добиться, чтобы мой API принимал параметры случая cammel, для этого я использую следующие

from pydantic import BaseModel
from humps import camelize


class CamelModel(BaseModel):
    class Config:
        alias_generator = camelize
        allow_population_by_field_name = True


class MyClass(CamelModel):
    my_field1: int
    my_field2: int
    my_field3: int

Пока он отлично работает, но MyClass является базовым классом для других классов, например как

class MyNewClass(MyClass):
    my_field4: float

Как я могу заставить MyNewClass также использовать базовый класс Camel case? Я пробовал что-то вроде

from typing import Union 
class MyNewClass(Union[MyClass, CamelModel]):
    my_field4: float

Но я получаю эту ошибку

TypeError: Cannot subclass <class 'typing._SpecialForm'>

Есть ли способ добиться этого? Спасибо!


person Rodrigo A    schedule 21.09.2020    source источник


Ответы (1)


То, чего вы пытаетесь достичь, называется multiple inheritance. Поскольку вы наследуете класс, унаследованный от CamelModel, нет необходимости снова наследовать его.

Соответствующий код должен быть

class MyNewClass(MyClass):

Это синтаксис Python для множественного наследования. См. Подробный пример здесь https://www.python-course.eu/python3_multiple_inheritance_example.php#An-Example-of-Multiple-Inheritance

Используемый вами код (class MyNewClass(Union[MyClass, CamelModel]):) используется для объявления типов данных, что отчасти правильно, но не в нужном месте. Печатание используется почти только (насколько я видел) для параметров функций.

ПРИМЕЧАНИЕ. Я не тестировал приведенный выше фрагмент кода, но уверен, что он работает. Сообщите мне, если возникнут проблемы

person lsabi    schedule 21.09.2020
comment
Вы правы, это просто наследование классов, этот способ должен работать нормально, спасибо за ответ! - person Rodrigo A; 22.09.2020
comment
Пожалуйста. Если это сработало, отметьте ответ как принятый, чтобы он не отображался как открытый. - person lsabi; 22.09.2020