Модель pydantic неправильно применяет проверкуPython

Программы на Python
Anonymous
Модель pydantic неправильно применяет проверку

Сообщение Anonymous »

У меня есть такая модель:

Код: Выделить всё

class SomeModel(BaseModel):
name: str

class SomeOtherModel(BaseModel):
name: int

class MyModel(BaseModel):
items: List[Union[SomeModel, SomeOtherModel]]

@validator("items", always=True)
def validate(cls, value):
by_type = list(filter(lambda v: isinstance(v, SomeModel), value))
if len(by_type) < 1:
raise ValueError("we need at least one SomeModel")

Подмодели не важны, по сути мне нужен список различных подмоделей, и этот список должен содержать хотя бы одну из первого типа. Все хорошо.
В другом месте моего кода я имею в виду эту модель (контекст: для целей сохранения пользовательских настроек не имеет значения для этого вопроса).

Код: Выделить всё

class ComposerModels(BaseModel):
user: List[MyModel] = []
system: List[MyModel] = []

class ComposerSettings(BaseModel):
models: ComposerModels

class UserSettings(BaseModel):
composer: ComposerSettings
Моя программа должна иметь возможность сохранять новые модели в модели UserSettings, примерно так;

Код: Выделить всё

my_model = MyModel(items=[SomeModel(name="a"), SomeOtherModel(name=1)])

user_settings = UserSettings(
composer=ComposerSettings(
models=ComposerModels(
user=[my_model]
)
)
)
Однако при этом возникает ошибка;

Код: Выделить всё

Traceback (most recent call last):
File ".../pydantic/shenanigans.py", line 38, in 
user=[my_model]
File "pydantic/main.py", line 342, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for ComposerModels
user -> 0
we need at least one SomeModel (type=value_error)
И здесь возникает странность.
По какой-то причине при попытке создать экземпляр UserSettings происходит проверка элементов внутри MyModel, но вместо того, чтобы передать список подмоделей, как ожидалось, каким-то образом вместо этого он получает список экземпляров MyModel. Очевидно, что это не проходит проверку и вызывает ошибку, указанную выше. Однако, если я закомментирую код проверки, он сработает. Ошибки нет, и модель пользовательских настроек содержит ожидаемую MyModel.
Я не могу просто отключить эту проверку, она нужна мне в другом месте моей программы... Есть идеи, что здесь происходит? Я в тупике...
Я использую Python 3.7 с pydantic 1.10 на Centos 7. Я не могу легко обновить какие-либо версии, потому что моя компания не верит в DevOps. так что, если это известная ошибка в pydantic в этой версии, мне придется подумать о чем-то другом.

Подробнее здесь: https://stackoverflow.com/questions/784 ... validation

Вернуться в «Python»