#python #validation #tuples #marshmallow
Вопрос:
У меня есть такое поле
coordinates = Tuple(
(Float(), Float()),
required=True,
)
внутри координат два значения: широта и долгота
Я должен проверить, чтобы эти поля соответствовали этому условию«.’: ((-90.0, 90.0), (-180.0, 180.0))
Кто-нибудь знает, как это сделать? Я использую библиотеку зефира
Большое спасибо
Ответ №1:
Вы можете написать функцию проверки с помощью @validates
декоратора:
from marshmallow import fields, Schema, validates, ValidationError
class CoordinatesSchema(Schema):
coordinates = fields.Tuple(
(fields.Float(), fields.Float()),
required=True,
)
@validates("coordinates")
def validate_coordinates(self, value):
if value[0] not in (-90.0, -180.0):
raise ValidationError("The first coordinate can only be -90.0 or -180.0.")
if value[1] not in (90.0, 180.0):
raise ValidationError("The second coordinate can only be 90.0 or 180.0.")
coords = {"coordinates": (-90.0, 180.0)}
CoordinatesSchema().load(coords) # OK
coords = {"coordinates": (70.0, 180.0)}
try:
CoordinatesSchema().load(coords) # ValidationError
except ValidationError as err:
print(err.messages) # 'coordinates': ['The first coordinate can only be -90.0 or -180.0.']}
Обратите внимание, что в приведенной выше validate_coordinates
функции, если и первая, и вторая координаты являются недопустимыми, только первая координата будет указана как таковая. Это можно исправить, добавив дополнительный if
параметр, который проверяет, являются ли обе координаты недопустимыми.