前言
在python 函數和類中,參數聲明時可以聲明參數是必填類型,也可以給參數設置默認值。
函數中的參數
以下函數,參數a是必填項,b給了默認值,是可選項。
- a參數聲明為int類型
- b參數聲明為int類型,並給了默認值1
- -> int 是聲明函數返回值是int類型
def fuc1(a: int, b: int = 1) -> int:
print('a+b的值為:', a+b)
return a+b
if __name__ == '__main__':
fuc1(2)
如果我們想給b參數設置默認值為None, 如果用戶傳了b參數,b必須是int類型,於是可以設置b: int = None
def fuc1(a: int, b: int = None) -> int:
if b:
print('a+b的值為:', a+b)
return a + b
else:
print('a的值為:', a)
return a
if __name__ == '__main__':
fuc1(2)
以上代碼在pycharm 編輯器上執行是沒有問題的,但是有些編輯器並不能識別b: int = None
這種語法。於是就有了 Optional 類。
Optional 可選類型
Optional 的作用是可選類型,作用幾乎和帶默認值的參數等價。不同的是使用Optional會告訴你的IDE或者框架:這個參數除了給定的默認值外還可以是None,而且使用有些靜態檢查工具如mypy時,對 a: int =None這樣類似的聲明可能會提示報錯,但使用a :Optional[int] = None不會。
typing.Optional 可選類型
Optional[X] 等價於 Union[X, None]
請注意,這與可選參數的概念不同,后者是默認參數,具有默認值的可選參數Optional 僅在其類型注釋中不需要限定符,因為它是可選的。
例如:
def foo(arg: int = 0) -> None:
...
另一方面,如果 None 允許使用顯示值,則Optional 無論參數是否可選,的適合使用,例如
def foo(arg: Optional[int] = None) -> None:
...
Optional[X] 等價於 Union[X, None],當Optional參數的默認值為None時
from typing import Optional
def func(a: int, b: Optional[int] = None) -> None:
"""Optional[int]=None"""
if b:
print("a+b的值:", a+b)
else:
print("b is None")
if __name__ == '__main__':
func(2)
運行結果:b is None
當Optional參數的默認值不為None,為1的時候
from typing import Optional
def func(a: int, b: Optional[int] = 1) -> None:
"""Optional[int]=None"""
if b:
print("a+b的值:", a+b)
else:
print("b is None")
if __name__ == '__main__':
func(a=1, b=None)
此時傳b=None,編輯器也不會提示有問題,這說明函數中b是一個可選參數,並且提示你它的默認值可以為None。
Union[X, None]
如果一個參數可以是2種類型,上面的函數b參數,可以是None, 也可以是int, 於是可以這樣寫
from typing import Optional, Union
def func(a: int, b: Union[None, int] = 1) -> None:
"""Optional[int]=None"""
if b:
print("a+b的值:", a+b)
else:
print("b is None")
if __name__ == '__main__':
func(a=1, b=None)
再舉個例子,函數的參數a可以是str 和 int 兩種類型,返回值也可以是 str 和 int
from typing import Union
def fun1(a: Union[str, int]) -> Union[str, int]:
"""str or int"""
return a
於是可以看到在編輯器中函數的傳str 和 int不會提示語法問題,傳其它的None 或 list就會有語法提示。
pydantic 中的字段類型
pydantic 使用標准庫類型,支持來自 python 標准庫的許多常見類型。
None,type(None)或Literal[None] 只允許None值
bool 布爾值
int pydantic用於int(v)將類型強制轉換為int;
float 同樣,float(v)用於將值強制為浮點數
str 字符串按原樣接受,int float使用Decimal強制轉換,使用轉換str(v),bytes繼承自的枚舉使用轉換,所有其他類型都會導致錯誤bytearray v.decode() str v.value
bytes bytes按原樣接受,bytearray使用轉換,使用 , 和 , 進行轉換,bytes(v)使用強制轉換str v.encode() int float Decimal str(v).encode()
list 允許list, tuple, set, frozenset, deque, 或生成器並強制轉換為列表
tuple 允許list, tuple, set, frozenset, deque, 或生成器並強制轉換為元組
dict dict(v)用於嘗試轉換字典
set 允許list, tuple, set, frozenset, deque, 或生成器並強制轉換為集合
deque 允許list, tuple, set, frozenset, deque, 或生成器並強制轉換為雙端隊列
typing.Any 允許任何值,包括None,因此Any字段是可選的
typing.Annotated 根據PEP-593允許使用任意元數據包裝另一種類型。提示可能包含對function的 Annotated單個調用,但其他元數據將被忽略並使用根類型
typing.TypeVar 限制基於constraintsor允許的值bound
typing.Union 參考前面的
typing.Optional Optional[x]簡寫Union[x, None]
.... 還有很多