Python3的高级用法之类型提示

Python3的高级用法之类型提示

是不是曾经看到过类似这样的代码

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

感觉很高大上。

这其实是Python3.5版本开始的一个新功能,类型提示。这个代码的意思就是,提示你输入参数name的值是str类型,返回值也是str类型。

以下参考官方文档。

类型别名

from typing import List
Vector = List[float]

def scale(scalar: float, vector: Vector) -> Vector:
    return [scalar * num for num in vector]

# typechecks; a list of floats qualifies as a Vector.
new_vector = scale(2.0, [1.0, -4.2, 5.4])

把list里面放float类型,并且取个新名字叫Vector

取别名在限定复杂的参数类型的时候很有用,比如以下代码

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:
    ...

自己定义类型

from typing import NewType
UserId = NewType('UserId', int)
some_id = UserId(524313)

自己定义了一个UserId类型

这个有啥用呢?继续看一个代码

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

# 正常
user_a = get_user_name(UserId(42351))

# 直接传-1也没事,不进行类型检查。  
user_b = get_user_name(-1)

-1虽说是int类型,但是,不是UserId类型,直接传-1也不会报错,静态检查器会把新类型看成为原始类型的子类,这样有助于处理逻辑错误。

新定义的UserId类型也能执行int类型的运算

# 'output' 是int类型,而不是UserId类型
output = UserId(23413) + UserId(54341)

注意:这里为啥最后output是int类型,官方解释是,自己定义的类型仅由静态类型检查器强制执行,但是运行时会立马返回原始类型(也就是int类型),这也就意味着不能直接创建UserId的子类型,因为他是运行时的标识函数,而不是实际类型

看一下这个小例子

def test(name: str) -> str:
    return (1,2)

test([1,2,3])

看这里,要求输入是str类型,我强行输入的是一个list,要求返回的是str,我强行返回的是一个tuple,但是这个代码并不报错,而且返回的类型是tuple而不是指定的str

我的理解是,这个只是一个标注作用,目前来说就是提示别人调用我的函数的人,我的参数类型是什么,返回值的类型是什么。就是一个提示作用,并不会对这些类型进行匹配检查。后期我觉得官方可能会强制要求类型必须匹配,也许不会(不然有点像java的感觉了)。

原文地址:https://www.cnblogs.com/realwuxiong/p/13533822.html