`mypy` 如何知道 pydantic 模型的签名?

问题描述 投票:0回答:1

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__
签名?

python mypy pydantic
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.