为什么 Pydantic 隐藏异常引发线?

wha*_*the 6 python pydantic

我正在使用 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 的代码库,但在引发异常时它似乎没有做任何特别的事情。