1

我使用 pydantic 的 dataclass 装饰器创建了一个类,我想在参数成为类的属性之前检查它的类型。这是我的代码:

from pydantic.dataclasses import dataclass
from pydantic import validator

@dataclass
class Person(object):
    name: Optional[str] = None

    @validator('name')
    def name_must_be_str(cls, v):
        if type(v) is not str:
            raise TypeError("'name' must be str, not " + type(v).__name__)
        return v

现在,当我创建一个像 person = Person(12) 这样的实例时,参数也变成了一个字符串 ('12')。如何在实例将参数转换为字符串之前检查类型?

4

1 回答 1

0

我以前从未使用过 pydantic,因此以下可能不是最佳解决方案,但根据文档,您可以使用__post_init__dunder 方法dataclass在将值转换为指定类型之前运行代码:

from typing import Optional

from pydantic.dataclasses import dataclass
from pydantic import validator


@dataclass
class Person:
    name: Optional[str] = None

    def __post_init__(self):
        if not isinstance(self.name, str):
            print(f'Careful! Your name, {self.name}, is not a string!')

    @validator('name')
    def name_must_be_str(cls, v):
        if type(v) is not str:
            raise TypeError("'name' must be str, not " + type(v).__name__)
        return v


print(Person(1))
# Careful! Your name, 1, is not a string!
# Person(name='1')

还有一些预验证器可以指定为@validator('name', pre=True),它们还在转换前运行代码:

@dataclass
class Person:
    name: Optional[str] = None

    @validator('name', pre=True)
    def name_must_be_str(cls, v):
        if type(v) is not str:
            raise TypeError("'name' must be str, not " + type(v).__name__)
        return v


print(Person(1))

但对我来说,由于某种原因,它们返回了两个相同的错误:

ValidationError: 2 validation errors
name
  'name' must be str, not int (type=type_error)
name
  'name' must be str, not int (type=type_error)
于 2019-07-11T09:37:03.657 回答