為什么會(huì)有類型提示
python是一種動(dòng)態(tài)類型語(yǔ)言,這意味著我們?cè)诰帉懘a的時(shí)候更為自由,運(yùn)行時(shí)不需要指定變量類型
但是與此同時(shí) ide 無法像靜態(tài)類型語(yǔ)言那樣分析代碼,及時(shí)給我們相應(yīng)的提示,比如字符串的 split 方法
1
2
|
def split_str(s): strs = s.split( "," ) |
由于不知道參數(shù) s 是什么類型,所以當(dāng)你敲 s. 的時(shí)候不會(huì)出現(xiàn) split 的語(yǔ)法提示
解決上述問題,類型提示
python 3.6 新增了兩個(gè)特性 pep 484 和 pep 526
- pep 484:https://www.python.org/dev/peps/pep-0484/
- pep 526:https://www.python.org/dev/peps/pep-0526/
幫助 ide 為我們提供更智能的提示
這些新特性不會(huì)影響語(yǔ)言本身,只是增加一點(diǎn)提示
類型提示分類
主要分兩個(gè)
- 變量提示:pep 526 特性加的
- 函數(shù)參數(shù)提示:pep 484 特性加的
變量類型提示
沒有使用類型提示
想說明變量的數(shù)據(jù)類型只能通過注釋
1
2
3
4
5
6
7
8
9
10
|
# 'primes' is a list of integers primes = [] # type: list[int] # 'captain' is a string (note: initial value is a problem) captain = ... # type: str class starship: # 'stats' is a class variable stats = {} # type: dict[str, int] |
使用了類型提示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
from typing import list , classvar, dict # int 變量,默認(rèn)值為 0 num: int = 0 # bool 變量,默認(rèn)值為 true bool_var: bool = true # 字典變量,默認(rèn)為空 dict_var: dict = {} # 列表變量,且列表元素為 int primes: list [ int ] = [] class starship: # 類變量,字典類型,鍵-字符串,值-整型 stats: classvar[ dict [ str , int ]] = {} # 實(shí)例變量,標(biāo)注了是一個(gè)整型 num: int |
這里會(huì)用到 typing 模塊,后面會(huì)再展開詳解
假設(shè)變量標(biāo)注了類型,傳錯(cuò)了會(huì)報(bào)錯(cuò)嗎?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
from typing import list # int 變量,默認(rèn)值為 0 num: int = 0 # bool 變量,默認(rèn)值為 true bool_var: bool = true # 字典變量,默認(rèn)為空 dict_var: dict = {} # 列表變量,且列表元素為 int primes: list [ int ] = [] num = "123" bool_var = 123 dict_var = [] primes = [ "1" , "2" ] print (num, bool_var, dict_var, primes) # 輸出結(jié)果 123 123 [] [ '1' , '2' ] |
它并不會(huì)報(bào)錯(cuò),但是會(huì)有 warning,是 ide 的智能語(yǔ)法提示
所以,這個(gè)類型提示更像是一個(gè)規(guī)范約束,并不是一個(gè)語(yǔ)法限制
變量類型提示-元組打包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 正常的元組打包 a = 1 , 2 , 3 # 加上類型提示的元組打包 t: tuple [ int , ...] = ( 1 , 2 , 3 ) print (t) t = 1 , 2 , 3 print (t) # py3.8+ 才有的寫法 t: tuple [ int , ...] = 1 , 2 , 3 print (t) t = 1 , 2 , 3 print (t) # 輸出結(jié)果 ( 1 , 2 , 3 ) ( 1 , 2 , 3 ) ( 1 , 2 , 3 ) ( 1 , 2 , 3 ) |
為什么要加 ...
不加的話,元組打包的時(shí)候,會(huì)有一個(gè) warning 提示
變量類型提示-元組解包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 正常元組解包 message = ( 1 , 2 , 3 ) a, b, c = message print (a, b, c) # 輸出 1 2 3 # 加上類型提示的元組解包 header: str kind: int body: optional[ list [ str ]] # 不會(huì) warning 的栗子 header, kind, body = ( "str" , 123 , [ "1" , "2" , "3" ]) # 會(huì)提示 warning 的栗子 header, kind, body = ( 123 , 123 , [ "1" , "2" , "3" ]) |
optional 會(huì)在后面講 typing 的時(shí)候詳解
在類里面使用
1
2
3
4
|
class basicstarship: captain: str = 'picard' # 實(shí)例變量,有默認(rèn)值 damage: int # 實(shí)例變量,沒有默認(rèn)值 stats: classvar[ dict [ str , int ]] = {} # 類變量,有默認(rèn)值 |
classvar
- 是 typing 模塊的一個(gè)特殊類
- 它向靜態(tài)類型檢查器指示不應(yīng)在類實(shí)例上設(shè)置此變量
函數(shù)參數(shù)類型提示
不僅提供了函數(shù)參數(shù)列表的類型提示,也提供了函數(shù)返回的類型提示
栗子一
1
2
3
|
# 參數(shù) name 類型提示 str,而函數(shù)返回值類型提示也是 str def greeting(name: str ) - > str : return 'hello ' + name |
栗子二
1
2
|
def greeting(name: str , obj: dict [ str , list [ int ]]) - > none: print (name, obj) |
總結(jié)
到此這篇關(guān)于python類型提示type hints的文章就介紹到這了,更多相關(guān)python類型提示type hints內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://www.cnblogs.com/poloyy/p/15145380.html