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的感觉了)。
本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!