python进阶(21)typing模块--类型提示支持
typing介紹
??Python是一門弱類型的語言,很多時候我們可能不清楚函數參數的類型或者返回值的類型,這樣會導致我們在寫完代碼一段時間后回過頭再看代碼,忘記了自己寫的函數需要傳什么類型的參數,返回什么類型的結果,這樣就不得不去閱讀代碼的具體內容,降低了閱讀的速度,typing模塊可以很好的解決這個問題
注意:typing模塊只有在python3.5以上的版本中才可以使用,pycharm目前支持typing檢查
typing的作用
類型檢查,防止運行時出現參數和返回值類型不符合。
作為開發文檔附加說明,方便使用者調用時傳入和返回參數類型。
該模塊加入后并不會影響程序的運行,不會報正式的錯誤,只有提醒pycharm目前支持typing檢查,參數類型錯誤會黃色提示
常用類型
int,long,float: 整型,長整形,浮點型;
bool,str: 布爾型,字符串類型;
List, Tuple, Dict, Set:列表,元組,字典, 集合;
Iterable,Iterator:可迭代類型,迭代器類型;
Generator:生成器類型;
除了以上常用的類型,還支持 Any,Union,Tuple,Callable,TypeVar 和 Generic 類型組成。有關完整的規范,請參閱 PEP 484。有關類型提示的簡單介紹,請參閱 PEP 483
代碼示例
我們可以發現,func函數要求傳入的第2個參數為str類型,而我們調用時傳入的參數是int類型,此時Pycharm就會用黃色來警告你,我們將光標放到黃色的地方,會出現下面的提示
寫著期望類型是str,而現在是int,但是typing的作用僅僅是提示,并不會影響代碼執行,我們執行看看
執行結果如下:
[2, 3]
我們會發現并沒有報錯,因為typing僅僅是起到了提醒的作用
typing模塊的其他用法
類型別名
NewType
Callable
TypeVar泛型
Any類型
Union類型
類型別名
類型別名,就是給復雜的類型取個別名
# 給List[float]類型取個別名為Vector
Vector = List[float]
def scale(scalar: float, vector: Vector) -> Vector:
return [scalar * num for num in vector]
new_vector = scale(2.0, [1.0, -4.2, 5.4])
當然,類型別名我們完全可以不用,用以下寫法也一樣,看個人喜好
def scale(scalar: float, vector: List[float]) -> List[float]:
return [scalar * num for num in vector]
NewType
官網看了下,個人覺得這個沒啥用,就不細寫了
Callable
期望特定簽名的回調函數的框架可以將類型標注為 Callable[[Arg1Type, Arg2Type], ReturnType]。
[Arg1Type, Arg2Type]:代表參數類型
ReturnType:代表返回值類型
from typing import Callable
def get_next_item(name: str):
print(name)
# Callable 作為函數參數使用,其實只是做一個類型檢查的作用,檢查傳入的參數值 get_next_item 是否為可調用對象
def feeder(get_next_item: Callable[[str], None]) -> (str):
return get_next_item
v1 = feeder(get_next_item)
v1('hello')
# 結果
hello
TypeVar泛型
可以自定義一個任意類型,也可以自定義指定類型
自定義一個任意類型
# 自定義一個任意類型
T = TypeVar('T')
def func(user: T) -> T:
print(user)
return user
func('1')
func(1)
func([1])
func((1, 2))
func({"status": 200})
# 結果
1
1
[1]
(1, 2)
{'status': 200}
自定義指定類型
# 指定為int或者str
a = TypeVar('a', int, str)
s1: a = 1
s2: a = 'aaa'
s3: a = [] # 這里定義了列表,pycharm會出現黃色警告
print(s1, s2, s3)
# 結果
1 aaa []
Any
Any是一種特殊的類型。靜態類型檢查器認為所有類型均與 Any 兼容,同樣,Any 也與所有類型兼容。
也就是說,可對 Any 類型的值執行任何操作或方法調用,并賦值給任意變量:
from typing import Any
a = None # type: Any
a = [] # OK
a = 2 # OK
s = '' # type: str
s = a # OK
def foo(item: Any) -> int:
# Typechecks; 'item' could be any type,
# and that type might have a 'bar' method
item.bar()
...
此外,未指定返回值與參數類型的函數,都隱式地默認使用 Any:
def legacy_parser(text):
...
return data
# 兩種寫法效果是一樣的
def legacy_parser(text: Any) -> Any:
...
return data
Union
Union類型語法格式:Union[X, Y] ,相當于X | Y,意思是類型是X或者Y
如果我們想定義Union類型,就要寫成如下的eg:Union[X, Y],或者也可以使用縮寫X | Y(此寫法python3.10版本才支持)
from typing import Union
# 指定變量a的類型為int或者str
a: Union[int, str]
a = 1
print(a)
a = [] # 定義了一個列表,pycharm會有黃色警告提示
總結
以上是生活随笔為你收集整理的python进阶(21)typing模块--类型提示支持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RTSP Windows专用播放器Eas
- 下一篇: 开源智能聊天机器人rasa以及前端ras