问题:
在 python 中,如何实现数据类?
如何方便地对数据类型进行校验?
省流版
参考做法
- 安装 pydantic 这个第三方库
pip install pydantic
- 使用 pydantic 提供的 dataclass 定义数据类
from pydantic.dataclasses import dataclass
@dataclass
class Person:
name: str
phone_number: int
- 创建数据
# 这样能成功创建
my_person = Person(name="John", phone_number="13500000000")
# 这样无法通过数据检验, 会报错
my_person = Person(name="John", phone_number="this_is_not_a_number")
详细版
数据类
在 python 中, 如果想创建一个数据类,可以使用
from dataclasses import dataclass
用这个 dataclass
来装饰类
(注意, 这个模块是从 python 3.7 开始引入的)
比如
@dataclass
class Person:
name: str
phone_number: int
这样在实例化一个 Person
对象时, 就必须要传入 name 和 phone_number 这两个属性才能实例化.
my_person = Person(name="John", phone_number=13500000000)
如果缺少某个内容参数则会报错
my_person = Person(name="John")
TypeError: __init__() missing 1 required positional argument: 'name'
参数校验
但是这个 dataclass
不带参数校验, 也就是说在实例化时, 只要你传入了所有必须的参数, 就算这些参数不符合要求, 比如这样
my_person = Person(name="John", phone_number="this_is_not_a_number")
IDEA会检验到数据类型不对,
Expected type "int", got "str" instead
但是程序依然能够跑起来, 你依然能够不按规定类型去实例化这个 Person
参考做法
- 安装 pydantic 这个第三方库
pip install pydantic
- 使用 pydantic 提供的 dataclass 定义数据类, 而不是 python 自带 dataclasses 模块的 dataclass
from pydantic.dataclasses import dataclass
- 定义数据类
@dataclass
class Person:
name: str
phone_number: int
- 创建数据
# 这样能成功创建
my_person = Person(name="John", phone_number="13500000000")
# 这样无法通过数据检验, 会报错
my_person = Person(name="John", phone_number="this_is_not_a_number")