开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
使用 Python 类型注释的数据验证和设置管理。
pydantic在运行时强制执行类型提示,并在数据无效时提供用户友好的错误。
定义数据应该如何在纯正的、规范的 Python 中;用pydantic验证它。
List 列表校验值
from typing import List
from pydantic import BaseModel
class Order(BaseModel):
id: int
name = "tom"
items: List[str]order = Order(id=1, items=['grape', 'apple'])
这样就可以帮我们检查list的数值了
然后跟上面一样会帮我们做转换
>>> order = Order(id=1, items=['grape', 123])
>>> print(order.json())
{"id": 1, "name": "tom", "items": ["grape", "123"]}
Optional
可填可不填的参数,上面有利用“=” 来表达optional的概念,但是有时我们的default可能会使用None,这样我们的datatype就会被顶掉,那么这个时间就要使用Optional了
from typing import List, Optional
from pydantic import BaseModel
class Order(BaseModel):
id: int
name: Optional[str] = None
items: List[str]
上面的例子就是将“name”这个地方的默认值改成预设的None,如果有输入值,则要求这个值是str的格式。
Dict
就是字典 dictionary
from typing import List, Optional, Dict
from pydantic import BaseModel
class Order(BaseModel):
id: int
name: Optional[str] = None
items: List[str]
item_prices: Dict[str, int]
Dict的第一个值代表key的datatype,第二则是value的datatype
>>> order = Order(id=1, items=['grape'], item_prices={'grape': 5}
>>> order = Order(id=1, items=['grape'], item_prices={'grape': "h"}
...
pydantic.error_wrappers.ValidationError: 1 validation error for Order
嵌套
在 BaseModel 里面嵌套 BaseModel
from typing import List, Optional, Dict
from pydantic import BaseModel
class User(BaseModel):
name: str
class Order(BaseModel):
id: int
user: User
items: List[str]
要先将要组合进去的 class 提前声明!不然提示 NameError
>>> order = Order(id=1, user={"name": "kiwi"}, items=['banana'])
>>> print(order.json())
{"id": 1, "user": {"name": "kiwi"}, "items": ["banana"]}
>>> print(order.user.json())
{"name": "kiwi"}
更进阶的!
只讲少一点,做一个引入,感兴趣的同学可以自行研究
继承
class User(BaseModel):
name: str
class SuperUser(User):
age: int = 18
ORM
可以将 orm model 汇入到 pydantic 的 model 内,像是 sqlalchemy
class Item(BaseModel):
name: str
price: int
class Config:
orm_mode = True
额外的 Field
真对没有列在 model 的 key-value 改如何处理?有三种方法forbid/ignore/allow
- forbid: 禁止
- ignore: 忽略
- allow: 允许
class Item(BaseModel):
name: str
price: int
class Config:
extra = "forbid"
Validator
检查参数是否需要额外的校验规则
from pydantic import BaseModel, ValidationError, validator
class Model(BaseModel):
foo: str
@validator('foo')
def value_must_equal_bar(cls, v):
if v != 'bar':
raise ValueError('value must be "bar"')
return v