每日一包 - typing

304 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

介绍

typing 是Python3.5 版本中新增的专用于类型注解的内置模块,我们知道Python是一门动态解释型语言,我们在定义变量时其类型并不是固定的,因此typing 模块的主要作用就是为Python程序提供静态类型检查,通常在定义函数或者方法时使用该模块对参数进行类型注解,在调用函数或者方法时会为我们提供非常多的便利,比如调用函数时传递的参数或者并不是该函数需要的类型时,就会出现相应的提示,下面我们就一起来看看该模块如何使用吧。

使用

一些基础类型无需使用typing模块导入也可以使用,比如常用的list str int tuple None bool dict, 当然也可以通过typing进行导入

常用的类型注解类型

Any 类型

Any 类型是一种特殊的类型,静态类型检查器认为所有类型都和Any 兼容。但是也有对应的问题,在使用Any 时不会执行类型检查,另外如果未指定返回值和参数类型的函数都默认的隐式的使用Any

# 变量定义  变量名:类型 = 变量值
a: Any = None  # 表示变量a可以是Python支持的任何数据类型
    
def foo(a: Any, b: Any) -> Any:
    """
    :param a: Python支持的任何数据类型
    :param b: Python支持的任何数据类型
    :return: Python支持的任何数据类型
    """
    return a, b

Union

Union[X, Y] 表示类型是X 或者 Y 中的一种,如下代码示例。

from typing import Union
​
​
def foo(a: int, b: int) -> Union[int, str]:
    """
    :param a: int类型
    :param b: int类型
    :return: int 或者 str类型
    """
    if a + b > 0:
        return a+b
    return str(a+b)

Optional

Optional[x] 可选类型表示类型是X 或者None,可以等价于Union[X, None]

from typing import Optionaldef foo(a: int, b: int) -> Optional[int]:
    """
    :param a: int类型
    :param b: int类型
    :return: int 或者 None
    """
    if a + b > 0:
        return a+b

自定义类型

我们可以通过自定义类来进行类型注解。

class Test:
    
    def __init__(self, name):
        self.name = "test"
        
        
def foo(name: str) -> Test:
    """
    :param name: str类型
    :return: Test类的对象
    """
    return Test(name)

类型别名

我们可以将类型赋值给别名,就可以定义类型别名了,在使用时直接使用类型别名即可。

from typing import Dict
Vec = Dict[str: int]
​
​
def foo(name: str, age: int) -> Vec:
    """
    :param age: int类型
    :param name: str类型
    :return: Vec 类型别名Dict[str: int], 字典key是str类型, value是int类型
    """
    return {f"{name}": age}

总结

在使用typing 模块时,并不是强制执行类型注解,但是这些注解可以用于类型检查、IDE等第三方工具。在实际开发中灵活规范的运用typing 模块会让我们的开发更加高效,并且可以让代码变得更易读。

上述文章中介绍了几种常用的类型注解,typing 模块其实还有很多其他的类型注解和用法,有兴趣了解更多的XDM 可以去官网查看。