在使用pydantic进行投放前,如何进行类型检查?

时间:2019-07-11 08:04:08

标签: python validation types python-3.7 pydantic

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

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')。在实例将参数强制转换为字符串之前,如何检查类型?

1 个答案:

答案 0 :(得分:0)

我以前从未使用过pydantic,因此以下方法可能不是最佳解决方案,但是根据docs,您可以使用__post_init__的{​​{1}} dunder方法来运行将该值强制转换为指定类型之前的代码:

dataclass

还有pre-validators可以指定为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))