Как переключить логическое значение в Pydantic (FastAPI)

РЕДАКТИРОВАТЬ: после того, как @ juanpa.arrivillaga правильно утверждал, что исходный вопрос не давал минимального воспроизводимого примера, я решил переписать его, добавив больше контекста: я использую FastAPI.

Я попытался переключить значение элемента, определив валидатор, который возвращал бы not значения элемента:

from pydantic import BaseModel, Field, validator


class Foo(BaseModel):
    key: str = Field(...)
    condition: bool = Field(...)

    @validator('condition')
    def toogleCondition(cls, v):
        return not v

Этот инструмент работает.

Однако при использовании модели в FastAPI это (видимо) не сработало.

from fastapi import FastAPI
from pydantic import BaseModel, Field, validator


# insert Foo definition here

app = FastAPI()


@app.get("/fail", response_model=Foo)
def fail():
    return Foo(key='hola', condition=True)


@app.get("/success")
def success():
    return Foo(key='hola', condition=True).dict()

Если вы запустите этот код, вы увидите, что /fail переключает значение ДВА РАЗ, а /success только ОДИН РАЗ.

Это потому, что response_model СНОВА запускает проверку, которая включает ее еще раз.


person eltbus    schedule 26.04.2021    source источник
comment
Кстати, не используйте карту для побочных эффектов ... просто используйте обычный цикл.   -  person juanpa.arrivillaga    schedule 26.04.2021
comment
Привет @ juanpa.arrivillaga! Не могли бы вы подробнее рассказать об этом?   -  person eltbus    schedule 26.04.2021
comment
Это не минимальный воспроизводимый пример. Укажите его   -  person juanpa.arrivillaga    schedule 26.04.2021


Ответы (1)


Обычно это работает:

>>> import pydantic, typing
>>> data = [{'key': 'foo', 'condition': False}, {'key': 'bar', 'condition': True}]
>>> class Foo(pydantic.BaseModel):
...     key: str
...     condition: bool
...     @pydantic.validator("condition")
...     def toggle_condition(cls, v):
...         return not v
...
>>> class Bar(pydantic.BaseModel):
...     foo_list: typing.List[Foo]
...
>>> Bar(foo_list=data)
Bar(foo_list=[Foo(key='foo', condition=True), Foo(key='bar', condition=False)])
>>> data
[{'key': 'foo', 'condition': False}, {'key': 'bar', 'condition': True}]

Вот с чем я работаю:

>>> pydantic.version.VERSION
'1.7.3'
>>> import sys
>>> print(sys.version)
3.7.7 (default, May  6 2020, 04:59:01)
[Clang 4.0.1 (tags/RELEASE_401/final)]
person juanpa.arrivillaga    schedule 26.04.2021
comment
: / тогда я не знаю, в чем проблема ... я постараюсь найти ошибку, спасибо за ваше время и извините за неудобства - person eltbus; 26.04.2021