как проверить поле, состоящее из кортежа строк с типом float?

#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 параметр, который проверяет, являются ли обе координаты недопустимыми.