我正在使用 Pydantic,有件事让我很好奇,Pydantic 引发的异常隐藏了引发异常的行。
例如使用以下代码:
from typing import Any
from pydantic import BaseModel
from pydantic.error_wrappers import ErrorWrapper, ValidationError
from pydantic.utils import ROOT_KEY
class MyModel(BaseModel):
def __init__(self, **data: Any) -> None:
exc = TypeError(f"My TypeError")
raise ValidationError([ErrorWrapper(exc, loc=ROOT_KEY)], self.__class__)
super().__init__(**data)
class Foo(MyModel):
a: int
class Bar(BaseModel):
a: int
Run Code Online (Sandbox Code Playgroud)
从我的自定义模型引发的异常将打印引发异常的行:
Foo(a=42)
# Traceback (most recent call last):
# File "D:\_exc.py", line 23, in <module>
# Foo(a=42)
# File "D:\_exc.py", line 11, in __init__
# raise ValidationError([ErrorWrapper(exc, loc=ROOT_KEY)], self.__class__)
# pydantic.error_wrappers.ValidationError: 1 validation error for Foo
# __root__
# My TypeError (type=type_error)
Run Code Online (Sandbox Code Playgroud)
但是 Pydantic 默认引发的异常BaseModel将隐藏引发异常的行:
Bar(a="foo")
# Traceback (most recent call last):
# File "D:\_exc.py", line 25, in <module>
# Bar(a="foo")
# File "pydantic\main.py", line 331, in pydantic.main.BaseModel.__init__
# pydantic.error_wrappers.ValidationError: 1 validation error for Bar
# a
# value is not a valid integer (type=type_error.integer)
Run Code Online (Sandbox Code Playgroud)
Bar.parse_obj(42)
# File "D:\_exc.py", line 42, in <module>
# Bar.parse_obj(42)
# File "pydantic\main.py", line 510, in pydantic.main.BaseModel.parse_obj
# pydantic.error_wrappers.ValidationError: 1 validation error for Bar
# __root__
# Bar expected dict not int (type=type_error)
Run Code Online (Sandbox Code Playgroud)
这是外部 Python 库的某种默认行为吗?我尝试查看 Pydantic 的代码库,但在引发异常时它似乎没有做任何特别的事情。