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类型

相关文章
相关标签/搜索