mypy
如何以这种方式知道pydantic
模型的签名?
from pydantic import BaseModel
class Model(BaseModel):
a: int
Model(a='asd') # error: Argument "a" to "Model" has incompatible type "str"; expected "int"
pydantic
BaseModel
的元类如何改变__init__
签名?
Pydantic 在模型元类上使用 PEP681
dataclass_transform
来实现类似于原生 dataclasses.dataclass
装饰器的行为,以便为类型检查器生成 __init__
方法。阅读来源:
@typing_extensions.dataclass_transform(kw_only_default=True, field_specifiers=(Field,))
class ModelMetaclass(ABCMeta):
... # [omitted by me]
class BaseModel(_repr.Representation, metaclass=ModelMetaclass):
... # [omitted by me]
在 PEP 中:
如果
应用于类,则对于直接或间接派生自装饰类或使用装饰类作为元类的任何类,都将假定类数据类语义。dataclass_transform
PEP 示例(与 pydantic 所做的非常相似):
# The ``ModelMeta`` metaclass and ``ModelBase`` class are defined by
# a library. This could be in a type stub or inline.
@typing.dataclass_transform()
class ModelMeta(type): ...
class ModelBase(metaclass=ModelMeta): ...
# The ``ModelBase`` class can now be used to create new model
# subclasses, like this:
class CustomerModel(ModelBase):
id: int
name: str