py typing — Support for type hints

原文檔:https://docs.python.org/3/library/typing.htmlhtml

簡介

python是一門動態語言,而動態語言的變量類型極其靈活,使其在作一些工具,腳本時很是方便,可是同時也給大型項目的開發帶來了一些麻煩,好比過一陣子就不知道這個變量啥類型的了,並且IDE還不容易識別你的變量類型,使用.的時候不會自動提示等。自python3.5開始,PEP484爲python引入了類型註解(type hints)。python

下面是一個簡單的例子:app

def greeting(name: str) -> str:
    return 'Hello ' + name

  在函數參數的後面用冒號加類型就能夠聲明該參數的類型,->表明了函數返回值的類型。函數

上面那一個簡單的即說明了typing的做用,同時,註釋變量的類型的時候還能夠時候 # type: str,下面兩種方法都可使用工具

# 使用註釋來標明變量類型
primes = [] # type:list[int]
captain = ... #type:str

class Starship:
    stats = {} #type:Dict[str,int]
# 使用typing來標註變量類型
primes:List[int] = []
captain:str #Note: no initial value

class Starship:
    stats: ClassVar[Dict[str,int]] = {}

  因爲python天生支持多態,迭代器中的元素可能多種,因此typing能夠配合or使用,以下:ui

# 使用or關鍵字表示多種類型
from typing import List
def func(a:int, string:str) -> List[int or str]:
    list1 = []
    list1.append(a)
    list1.append(string)
    return list1

 typing經常使用的類型:this

  • int,long,float: 整型,長整形,浮點型;
  • bool,str: 布爾型,字符串類型;
  • List, Tuple, Dict, Set:列表,元組,字典, 集合;
  • Iterable,Iterator:可迭代類型,迭代器類型;
  • Generator:生成器類型;

函數的註解只存儲在函數的__annotations屬性中。例如:scala

def add(x:int, y:int) -> int:
    return x + y
print(add.__annotations__)

  執行結果爲:orm

{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}

類型別名(type alias)

在下面這個例子中,Vector和List[float]能夠視爲同義詞server

from typing import List
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])

  類型別名有助於簡化一些複雜的類型聲明

from typing import Dict, Tuple, List

ConnectionOptions = Dict[str, str]
Address = Tuple[str, int]
Server = Tuple[Address, ConnectionOptions]

def broadcast_message(message: str, servers: List[Server]) -> None:
    ...

# The static type checker will treat the previous type signature as
# being exactly equivalent to this one.
def broadcast_message(
        message: str,
        servers: List[Tuple[Tuple[str, int], Dict[str, str]]]) -> None:
    pass

新類型(New Type)

使用NewType來輔助函數創造不一樣的類型

form typing import NewType

UserId = NewType("UserId", int)
some_id = UserId(524313)

  newtype相似於上面的別名機制:

from typing import NewType

UserId3 = NewType('UserId', int)  # 至關於給int起了個別名

first_user = UserId3(1)
print(type(first_user))  # 輸出int,不是UserId

  靜態類型檢查器將將新類型視爲原始類型的子類。這對於幫助捕獲邏輯錯誤很是有用

def get_user_name(user_id: UserId) -> str:
    pass

# typechecks
user_a = get_user_name(UserId(42351))

# does not typecheck; an int is not a UserId
user_b = get_user_name(-1)

  你仍然可使用int類型變量的全部操做來使用UserId類型的變量,但結果返回的都是都是int類型。例如

# output仍然是int類型而不是UserId類型
output = UserId(23413) + UserId(54341)

  雖然這沒法阻止你使用int類型代替UserId類型,但能夠避免你濫用UserId類型

相關文章
相關標籤/搜索