• Python


    常见触发错误的情况

    • 如果传入的字段多了会自动过滤
    • 如果传入的少了会报错,必填字段
    • 如果传入的字段名称对不上也会报错
    • 如果传入的类型不对会自动转换,如果不能转换则会报错

    错误的触发

    pydantic 会在它正在验证的数据中发现错误时引发 ValidationError

    注意

    • 验证代码不应该抛出 ValidationError 本身
    • 而是应该抛出 ValueError、TypeError、AssertionError 或他们的子类
    • ValidationError 会包含所有错误及其发生方式的信息

    访问错误的方式

    • e.errors():返回输入数据中发现的错误的列表
    • e.json():以 JSON 格式返回错误(推荐)
    • str(e):以人类可读的方式返回错误

    简单栗子

    # 一定要导入 ValidationError
    from pydantic import BaseModel, ValidationError
    
    
    class Person(BaseModel):
        id: int
        name: str
    
    
    try:
        # id是个int类型,如果不是int或者不能转换int会报错
        p = Person(id="ss", name="hallen")  
    except ValidationError as e:
      # 打印异常消息
        print(e.errors())

    e.errors() 的输出结果

    [{'loc': ('id',), 'msg': 'value is not a valid integer', 'type': 'type_error.integer'}]

    e.json() 的输出结果

    [
      {
        "loc": [
          "id"
        ],
        "msg": "value is not a valid integer",
        "type": "type_error.integer"
      }
    ]

    str(e) 的输出结果

    1 validation error for Person
    id
      value is not a valid integer (type=type_error.integer)

    复杂栗子

    class Location(BaseModel):
        lat = 0.1
        lng = 10.1
    
    
    class Model(BaseModel):
        is_required: float
        gt_int: conint(gt=42)
        list_of_ints: List[int] = None
        a_float: float = None
        recursive_model: Location = None
    
    
    data = dict(
        list_of_ints=['1', 2, 'bad'],
        a_float='not a float',
        recursive_model={'lat': 4.2, 'lng': 'New York'},
        gt_int=21
    )
    
    try:
        Model(**data)
    except ValidationError as e:
        print(e.json(indent=4))

    输出结果

    [
        {
            "loc": [
                "is_required"
            ],
            "msg": "field required",
            "type": "value_error.missing"
        },
        {
            "loc": [
                "gt_int"
            ],
            "msg": "ensure this value is greater than 42",
            "type": "value_error.number.not_gt",
            "ctx": {
                "limit_value": 42
            }
        },
        {
            "loc": [
                "list_of_ints",
                2
            ],
            "msg": "value is not a valid integer",
            "type": "type_error.integer"
        },
        {
            "loc": [
                "a_float"
            ],
            "msg": "value is not a valid float",
            "type": "type_error.float"
        },
        {
            "loc": [
                "recursive_model",
                "lng"
            ],
            "msg": "value is not a valid float",
            "type": "type_error.float"
        }
    ]
    • value_error.missing:必传字段缺失
    • value_error.number.not_gt:字段值没有大于 42
    • type_error.integer:字段类型错误,不是 integer

    自定义错误

    # 导入 validator
    from pydantic import BaseModel, ValidationError, validator
    
    
    class Model(BaseModel):
        foo: str
    
        # 验证器
        @validator('foo')
        def name_must_contain_space(cls, v):
            if v != 'bar':
                # 自定义错误信息
                raise ValueError('value must be bar')
            # 返回传进来的值
            return v
    
    
    try:
        Model(foo="ber")
    except ValidationError as e:
        print(e.json())

    输出结果

    [
      {
        "loc": [
          "foo"
        ],
        "msg": "value must be bar",
        "type": "value_error"
      }
    ]

    自定义错误模板类

    from pydantic import BaseModel, PydanticValueError, ValidationError, validator
    
    
    class NotABarError(PydanticValueError):
        code = 'not_a_bar'
        msg_template = 'value is not "bar", got "{wrong_value}"'
    
    
    class Model(BaseModel):
        foo: str
    
        @validator('foo')
        def name_must_contain_space(cls, v):
            if v != 'bar':
                raise NotABarError(wrong_value=v)
            return v
    
    
    try:
        Model(foo='ber')
    except ValidationError as e:
        print(e.json())

    输出结果

    [
      {
        "loc": [
          "foo"
        ],
        "msg": "value is not "bar", got "ber"",
        "type": "value_error.not_a_bar",
        "ctx": {
          "wrong_value": "ber"
        }
      }
    ]

    PydanticValueError

    自定义错误类需要继承这个或者 PydanticTypeError

  • 相关阅读:
    Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round)(A-C题解)
    最小生成树
    并查集
    字符串的匹配算法
    CTU Open Contest 2019 AB题
    Codeforces Round #624 (Div. 3)(题解)
    Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)
    Lyft Level 5 Challenge 2018
    终于在博客写完第一篇题解啦
    Codeforces Round #519 by Botan Investments(前五题题解)
  • 原文地址:https://www.cnblogs.com/poloyy/p/15260483.html
Copyright © 2020-2023  润新知