2 回答

TA貢獻1864條經(jīng)驗 獲得超2個贊
什么是變量注釋?
變量注釋只是注釋的下一步# type
,因為它們被定義為PEP 484
; PEP 526的相應部分強調了這一變化背后的基本原理。
所以,而不是暗示類型:
primes = [] # type: List[int]
引入了新語法以允許使用表單賦值直接注釋類型:
primes: List[int] = []
正如@Martijn指出的那樣,typing
它通過使用可用的類型并將其初始化為空列表來表示整數(shù)列表。
它帶來了什么變化?
引入的第一個更改是新語法,允許您使用類型注釋名稱,可以在:
字符后單獨添加,也可以選擇注釋,同時為其指定值:
annotated_assignment_stmt ::= augtarget ":" expression ["=" expression]
所以有問題的例子:
primes: List[int] = [ ]# ^ ^ ^# augtarget | |# expression |# expression (optionally initialize to empty list)
還引入了其他更改以及新語法; 模塊和類現(xiàn)在具有一個__annotations__
屬性(如PEP 3107之后的函數(shù) - 函數(shù)注釋),其中附加了類型元數(shù)據(jù):
from typing import get_type_hints # grabs __annotations__
現(xiàn)在__main__.__annotations__
保存聲明的類型:
>>> from typing import List, get_type_hints>>> primes: List[int] = []>>> captain: str>>> import __main__>>> get_type_hints(__main__){'primes': typing.List<~T>[int]}
captain
目前不會顯示,get_type_hints
因為get_type_hints
只返回模塊上也可以訪問的類型; 即,它首先需要一個值:
>>> captain = "Picard">>> get_type_hints(__main__){'primes': typing.List<~T>[int], 'captain': <class 'str'>}
使用print(__annotations__)
會顯示,'captain': <class 'str'>
但你真的不應該__annotations__
直接訪問。
同樣,對于類:
>>> get_type_hints(Starship)ChainMap({'stats': typing.Dict<~KT, ~VT>[str, int]}, {})
其中a ChainMap
用于獲取給定類(位于第一個映射中)的注釋以及在其中找到的基類中定義的所有注釋mro
(對應的映射{}
)。
除了新語法之外,ClassVar
還添加了一個新類型來表示類變量。是的,stats
在你的例子中實際上是一個實例變量,而不是一個ClassVar
。
我會被迫使用它嗎?
與類型提示一樣PEP 484
,這些是完全可選的,主要用于類型檢查工具(以及基于此信息可以構建的任何其他工具)。當發(fā)布穩(wěn)定版本的Python 3.6時,它將是臨時的,因此將來可能會添加一些小的調整。
添加回答
舉報