Python是一門弱類型的語言,很多時候我們可能不清楚函數參數類型或者返回值類型,很有可能導致一些類型沒有指定方法,在寫完代碼一段時間后回過頭看代碼,很可能忘記了自己寫的函數需要傳什么參數,返回什么類型的結果,就不得不去閱讀代碼的具體內容,降低了閱讀的速度,typing模塊可以很好的解決這個問題
Python 運行時并不強制標注函數和變量類型。類型標注可被用于第三方工具,比如類型檢查器、集成開發環境、靜態檢查器等
typing的主要作用有:
類型檢查,防止運行時出現參數、返回值類型不符
作為開發文檔附加說明,方便使用者調用時傳入和返回參數類型
模塊加入不會影響程序的運行不會報正式的錯誤,pycharm支持typing檢查錯誤時會出現黃色警告
語法:
def函數名(參數:數據類型)->返回值類型:pass變量名:數據類型=值
要定義一個類型別名,可以將一個類型賦給別名。類型別名可用于簡化復雜類型簽名,同時類型別名適用于簡化復雜的類型簽名
#!/usr/bin/envpython#-*-coding:UTF-8-*-#@author:A.L.Kun#@file:test.py#@time:2022/5/1316:54fromtypingimportSequenceConnectionOptions=dict[str,int]#表示字典中的鍵為字符串類型,值為整型Address=tuple[str,int,...]#表示元組的第一個數據為字符串,第二個數據為整型,里面只能存儲兩個數據,有省略號表示里面可以添加n個整型數據Server=tuple[Address,ConnectionOptions]defbroadcast_message(message:str,servers:Sequence[Server]#表示一個序列對象里面存儲了[tuple[tuple[str,int],dict[str,int]]])->None:#返回值為空...broadcast_message("a",[(("a",1,2),{"a":1})])
使用NewType輔助函數創建不同的類型,靜態類型檢查器會將新類型視為它是原始數據的子類,相當于C++里面的`typedef
#!/usr/bin/envpython#-*-coding:UTF-8-*-#@author:A.L.Kun#@file:test.py#@time:2022/5/1316:54fromtypingimportNewTypeUserId=NewType('UserId',int)#其不會創建一個新的類或引入其他內存,只是做一個約束作用defname_by_id(user_id:UserId)->str:...name_by_id(42)#Failstypecheckname_by_id(UserId(42))#OKnum=UserId(5)+1#type:int,可以進行對應數據類型的操作
同時,可以嵌套創建,即可以基于NewType創建NewType
Callable[[Arg1Type,Arg2Type],ReturnType]
如,實現一個互斥鎖的裝飾器
#!/usr/bin/envpython#-*-coding:UTF-8-*-#@author:A.L.Kun#@file:test.py#@time:2022/5/1316:54fromcollections.abcimportCallable#注意要使用Concatenate和ParamSpec就必須使用這個模塊里面的CallablefromthreadingimportLockfromtypingimportTypeVarfrompip._vendor.typing_extensionsimportConcatenate,ParamSpec#導入typing的擴展P=ParamSpec('P')#里面有args和kwargs參數R=TypeVar('R')#自定義數據類型my_lock=Lock()#創建一個互斥鎖defwith_lock(f:Callable[Concatenate[Lock,P],R])->Callable[P,R]:'''一個提供互斥鎖,使得線程安全的裝飾器'''definner(*args:P.args,**kwargs:P.kwargs)->R:returnf(my_lock,*args,**kwargs)returninner@with_lockdefsum_threadsafe(lock:Lock,numbers:list[float])->float:'''Addalistofnumberstogetherinathread-safemanner.'''withlock:returnsum(numbers)#Wedon'tneedtopassinthelockourselvesthankstothedecorator.print(sum_threadsafe([1.1,2.2,3.3]))
無需指定調用簽名,用省略號字面量替換類型提示里的參數列表: Callable[..., ReturnType],就可以聲明可調對象的返回類型
與 Callable 和 ParamSpec 一起使用,對一個高階可調用對象進行類型注釋,該對象可以增加、刪除或轉換另一個可調用對象的參數。 使用形式為Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable]。 Concatenate 目前只在作為 Callable 的第一個參數時有效。Concatenate 的最后一個參數必須是一個 ParamSpec
typing??熳罨镜闹С钟蠥ny ,Tuple,Callable,TypeVar 和 Generic類型組成
fromtypingimport(List,#list的泛型版本。用于注釋返回類型。要注釋參數,最好使用抽象集合類型,如Sequence或IterableSet,#set的泛型版本Dict#dict的泛型版本。對標注返回類型比較有用。如果要標注參數的話,使用如Mapping的抽象容器類型是更好的選擇)
fromtypingimport(Mapping,#要注釋函數參數中的Key-Value類型時,推薦使用的抽象集合類型Sequence,#要注釋函數參數中的序列例如列表類型時,推薦使用的抽象集合類型Iterable#要注釋函數參數中的迭代類型時,推薦使用的抽象集合類型)
TypeVar:其就像C++里面的template一樣
#!/usr/bin/envpython#-*-coding:UTF-8-*-#@author:A.L.Kun#@file:test.py#@time:2022/5/1316:54fromtypingimport(Sequence,TypeVar#限制多個變量為同一個數據類型)T=TypeVar('T')#CanbeanythingA=TypeVar('A',str,bytes)#Mustbestrorbytesdefrepeat(x:T,n:int)->Sequence[T]:"""Returnalistcontainingnreferencestox."""return[x]*ndeflongest(x:A,y:A)->A:"""Returnthelongestoftwostrings."""returnxiflen(x)>=len(y)elsey
AnyStr
AnyStr是一個字符串和字節類型的特殊類型變量AnyStr = TypeVar('AnyStr', str, bytes),它用于可以接受任何類型的字符串而不允許不同類型的字符串混合的函數
特殊類型,表明類型沒有任何限制
每一個類型都對 Any 兼容
Any 對每一個類型都兼容
Any 是一種特殊的類型。靜態類型檢查器將所有類型視為與Any兼容,反之亦然, Any也與所有類型相兼容。
這意味著可對類型為 Any 的值執行任何操作或者方法調用并將其賦值給任意變量
如下所示,將 Any 類型的值賦值給另一個更具體的類型時,Python不會執行類型檢查。例如,當把 a 賦值給 s 時,即使 s 被聲明為 str類型,在運行時接收到的是 int 值,靜態類型檢查器也不會報錯
#!/usr/bin/envpython#-*-coding:UTF-8-*-#@author:A.L.Kun#@file:test.py#@time:2022/5/1316:54fromtypingimport(Any,NoReturn,#表示函數沒有返回值)deftest(s:Any)->NoReturn:s.item()#不會檢測s里面是否有item()屬性deftest_(s:object)->NoReturn:s.item()#會檢測s里面是否有item屬性
當參數無類型是,默認為Any類型
一個注解為 C 的變量可以接受一個類型為 C 的值。相對地,一個注解為 Type[C] 的變量可以接受本身為類的值 。 更精確地說它接受 C的 類對象
#!/usr/bin/envpython#-*-coding:UTF-8-*-#@author:A.L.Kun#@file:test.py#@time:2022/5/1316:54fromtypingimport(Type,)classUser:...classBasicUser(User):...#AcceptsUser,BasicUser,...defmake_new_user(user_class:Type[User])->User:returnuser_class()print(make_new_user(User))
聯合類型;Union[X, Y]意味著:要么是 X,要么就是 Y。定義一個聯合類型,需要注意的有:
參數必須是類型,而且必須至少有一個參數。
能繼承或者實例化一個聯合類型。
Union[X, Y]不能寫成 Union[X][Y] 。
可以使用 Optional[X] 作為Union[X, None]的縮寫- 聯合類型的聯合類型會被展開打平
僅有一個參數的聯合類型會坍縮成參數自身,比如:
Union[int]==int#Theconstructoractuallyreturnsint
多余的參數會被跳過,比如:
Union[int,str,int]==Union[int,str]
在比較聯合類型的時候,參數順序會被忽略,比如:
Union[int,str]==Union[str,int]
可選類型,Optional[X] 等價于Union[X, None]
元組類型,Tuple[X, Y] 標注了一個二元組類型,其第一個元素的類型為 X 且第二個元素的類型為Y??赵M的類型可寫作 Tuple[()]
為表達一個同類型元素的變長元組,使用省略號字面量,如Tuple[int, ...]。單獨的一個 Tuple 等價于 Tuple[Any, ...],進而等價于tuple
示例: Tuple[int, float, str]表示一個由整數、浮點數和字符串組成的三元組
可調用類型;Callable[[int], str]是一個函數,接受一個 int 參數,返回一個str。下標值的語法必須恰為兩個值:參數列表和返回類型。參數列表必須是一個類型和省略號組成的列表;返回值必須是單一一個類型
不存在語法來表示可選的或關鍵詞參數,這類函數類型罕見用于回調函數。Callable[..., ReturnType](使用字面省略號)能被用于提示一個可調用對象,接受任意數量的參數并且返回 ReturnType。單獨的 Callable 等價于Callable[..., Any],并且進而等價于 collections.abc.Callable
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
央行下調存款準備金率意味著什么?簡單說存款準備金就是央行要求各商業銀行繳存的一部分備用金,存款準備金占其存款總額的比例就是存款準備金率。下調準備金率,是寬松的貨幣政策的體現,對銀行、企業、證券市場以及個人投資者均有影響,主要表現在:對銀行:下調準備金率,銀行可使用資金增加,則可以借出的信貸資金增加,提高資金的靈活性,也能使銀行盈利增加。對企業:下調準備金率后,資金緊張的企業去銀行申請貸款會比準備金...
全面兩孩是什么意思?這意味著二胎政策子的政策已經完全自由化。無論父母雙方是什么情況,無論雙方都是獨生子女,單方面是獨生子女,還是非獨生子女,都可以生第二個孩子。單獨生第二個孩子是指只要父母一方是獨生子女,就允許生第二個孩子,雙方都是獨生子女,也允許生第二個孩子。單獨二胎實施省份有哪些?1.自2014年1月17日起,浙江省實施了單獨的二胎政策2014年1月13日浙江省通過,自公布之日(2014年1月...
【資料圖】最近這段時間總有小伙伴問小編VR黑玻璃材質參數怎么調是什么,小編為此在網上搜尋了一些有關于VR黑玻璃材質參數怎么調的知識送給大家,希望能解答各位小伙伴的疑惑。1、漫反射給黑色反射給一些,折射給到一半左右;2、漫反射給偏黑色,反射給一些,折射給全透明;3、折射煙霧顏色里面調成灰色,值不要太大,需要測試;4、表面漫射色給成烤漆玻璃顏色,反射給200到220左右,不要太高,勾選Fresnel,...