Я работаю с marshmallow-dataclass
в моем приложении APIFlask
, чтобы получить схемы для моих запросов API. Теперь я хотел бы иметь поле, которое можно оставить пустым, заполнить значением или явно задать None
с разным поведением для каждого.
Сейчас у меня есть что-то вроде этого:
Но теперь я не могу отличить, содержал ли исходный JSON {"bar": null}
или {}
. Я хотел бы провести это различие, сохранив при этом оба JSON-файла действительными, поэтому простого удаления значения по умолчанию недостаточно, поскольку {}
больше не будет действительным вводом.
Я нашел один обходной путь, а именно использование какого-либо другого вида синглтона или сигнального элемента в качестве значения по умолчанию:
Однако для меня это имеет два недостатка:
Я попытался исправить проблему 1, оставив значение по умолчанию на None
и обнаруживая с помощью хука @post_load
, содержали ли исходные данные ключ или нет, чтобы установить его в соответствии со своим пользовательским значением сигнального элемента, но в этот момент мне кажется, что я захожу слишком далеко в кроличью нору, чтобы добиться желаемого. Добавление metadata={"required": False}
к вызову field
также, похоже, не дало никакого эффекта.
Есть ли способ надежно проверить, присутствовало ли входное значение в исходных данных или использовалось значение по умолчанию?
from marshmallow_dataclass import dataclass
@dataclass
class FooIn:
bar: str | None = field(default=None)
from marshmallow_dataclass import dataclass
class _Undefined: pass
Undefined = _Undefined()
@dataclass
class FooIn:
bar: str | None = field(default=Undefined)