一、python的類型聲明
1、類型聲明的背景和作用
python 3.6+ 版本引入了“類型提示”
1、類型提示是一種新的語法,用來聲明變量的類型
2、提高編譯器和工具的支持能力
為什么要學習類型提示
1、了解類型提示不僅僅對使用FastAPI有幫助,也能提高代碼的可讀性度和可靠性有很大的幫助
類型提示的好處
1、不改變原始運行結果
2、提供更好的編譯器支持和代碼補全
編譯器支持
1、通過類型提示,編譯器可以幫助檢查代碼中的錯誤
2、例如,將int類型的age轉換為str類型
以下是類型聲明語法的示例代碼:
# python中類型聲明# 變量類型的聲明
a: int = 20
b: str = '11,22'
c: list = [11, 22]
print(a)# 函數的參數和返回值的類型聲明
def work(a: int, b: int) -> int:return a+b# 若不是int類型則會報錯
print(work(1, 1))
2、使用場景案例
1、變量的類型聲明
name: str = '張三'
age: int = 18
2、函數參數的類型聲明
def work(a: int, b: int):return a+b
3、函數返回值的類型聲明
def work2(name: str, age: int) -> dict:return { "名字": name, "年齡": int }def work3(datas: list) -> dict:return dict(enumerate(datas))
3、復合類型的類型聲明
上面的案例只對datas這個參數做了類型聲明,對于datas中的數據并沒有進行任何聲明,那么這種復合類型的數據類型如何進行聲明呢?需要使用typing標準庫聲明容器數據結構的類型和子類型
# 比如 我希望datas是列表嵌套字典的數據格式:[{"name":"張三"}, {"age": 18}, {"addr":"地址"}]from typing import List, Uniondef work4(datas: List[dict]) -> dict:print(datas)return {"data": datas}work4([{"name":"張三"}, {"age": 18}])def work5(datas: List[Union[str, int]]) -> dict:print(datas)return {"data": datas}work5(['名字', 18])
4、使用自定義類型聲明
class Person:def __init__(self, name: str, age: int):self.name = nameself.age = agedef get_person_info(p: Person) -> dict:return {"名字": p.name, "年齡": p.age}p = Person("張三", 18)
print(get_person_info(p))
二、Pydantic模型
1、使用方法
# fastapi關于類型校驗的參數模塊pydantic----中的pydantic-core專門負責校驗類型
# pip install fastapifrom pydantic import BaseModel, ValidationError class Student(BaseModel):name: strage: intsex: strdef work(stu: Student):print(stu.name)print(stu.age)print(stu.sex)if __name__ == '__main__':try:s = Student(name="張三", age=[18], sex="男")except ValidationError as e:print(e.json())
此時拋出的錯誤為:
PS D:\py> & c:/Users/judge/myenv/Scripts/python.exe d:/py/study-1.py
[{"type":"int_type","loc":["age"],"msg":"Input should be a valid integer","input":[18],"url":"https://errors.pydantic.dev/2.11/v/int_type"}]
2、pydantic模型對象的常用操作
# 1、轉換為字典
print(p.dict())
# 2、獲取部分字段
res = p.dict(include={'name', 'age'})
print(type(res), res)# 3、進行序列化---->json字符串
print(p.json())
# 4、進行反序列化---->對象 exclude
res2 = p.json(include={'name', 'age'})
print(type(res2), res2)