当前位置: 首页 > news >正文

Python 类型注释 - typing

文章目录

  • Python 类型注释
  • 简述
  • 用法说明
    • 基本类型
    • 容器类型
    • 特殊类型
    • 嵌套
  • 用法案例
    • 普通变量
    • 类成员
    • 函数参数
    • 函数返回类型
  • 效果
  • 参考资料

Python 类型注释

简述

Python 语言经常被人“诟病”的一个点就是类型,在变量定义、参数传递、参数返回时,由于没有类型常常会很困惑,导致开发效率下降。

Python 的 typing 包是从 Python 3.5 版本引入的标准库,它提供了类型提示和类型注解的功能,可用于对代码进行静态类型检查(结合IDE,如Pycharm)和类型推断。typing模块中定义了多种类型和泛型,以帮助提高开发者代码的可读性、可维护性和可靠性。

注:本文档的案例、语法、使用方式等基于 Python 3.8。

用法说明

在类型注释部分,分为基本类型注释,容器类型注释,特殊类型

基本类型

基本类型包含 bool, int, float, str, bytes,与参数、变量和函数返回值一起使用。这几个类型不需要从typing中import。

a : int
b : bool
c : float
d : str
e : bytes

容器类型

容器类型包含 List, Dict, Set, Tuple,分别用于对 Python 中的列表、字典、集合、元组做类型注释。这几个类型需要从typing中import才可使用。

  • List

列表内存储对象的数据类型需标注在方括号内,以存储 int 的列表为例,则需标注为 List[int]。

lst : List[int]
  • Dict

字典是以键值对的方式来存储数据的,那么在标注类型的时候,需在方括号内标注键和值的类型。以键为 int 类型、值为 str 类型的字典为例,则需标注为 Dict[int, str]。

dict : Dict[int, str]
  • Set

与列表类似,内部存储元素的数据类型需标注在方括号内,以存储 int 的集合为例,则需标注为 Set[int]。

def func(att : Set[int]):print(att)if __name__ == "__main__":s = {1, 2, 3}func(s)
  • Tuple

元组的类型标注需要在方括号中依次给出类型,也可以使用…允许将数量未知的元素包括在 Tuple 的类型标注中。

def func(att : Tuple[int, str, float]):print(att)if __name__ == "__main__":tup = (1, 'str', 1.2)func(tup)

特殊类型

特殊一点的类型有:自定义的类型、None、Any、Union、Optional等。

  • 自定义类型

如自定义了一个dataclass,用来表示某数据库表中id和对应数据,如下:

@dataclass
class Geometry:"""代表 data 表中的一条数据Attributes:id - data 表中的 iddata - geometry 对应的二进制几何数据"""id: bytesdata: bytes

如果要标注类型为 Geometry 的数据,则需将Geometry从对应的.py中引入,之后便可直接标注该类型:

def f(g: Geometry):print(g)geoms : List[Geometry]
  • None

无需从 typing 中导入,与 int, str 等类似,常用于标注函数返回。

如在没有返回值的函数中,对于返回类型可标注为 None,如下:

def func(att : Set[int]) -> None:print(att)
  • Any

表示没有约束的类型,所有类型都与 Any 兼容,Any 与所有类型都兼容。未指定返回值与参数类型的函数,都隐式地默认使用 Any

  • Union

表示 联合类型,需要从 typing 中 import 后使用,类似C++中的联合体。Union表示多个类型中的其中一个,如某值的类型可能是int, str, float之一,则可写为Union[int, str, float]:

def fun(att : Union[int, str, float]):print(att)if __name__ == "__main__":fun(1)fun('123')fun(1.23)
  • Optional

表示可选类型,表示一个值可以为指定类型或None。Optional[X] 等价于 Union[X, None]。

在某数据表中,对于某字段值可有可无。若无该字段,则应为None;若有,则单位的类型为str,因此可以写为:

field: Optional[str] = None

嵌套

在进行类型标注时,允许做类型的嵌套,在做类型的嵌套时,前面提到的任意容器类型之间可以嵌套。如:

data: List[Tuple[str, str]]

用法案例

普通变量

a : int
b : bool
c : float
d : str
e : bytes

表示 a 为 int, b 为 bool, c 为 float, d 为 str, e 为 bytes。

当对已添加类型注释的变量赋予错误的类型值时,在Pycharm 中会给出提示:

image.png

类成员

对类中各个成员的类型的注释与普通变量的注释格式相同,如定义一个表示属性的结构:

@dataclass
class Property:"""代表一个属性Attributes:id - 属性 的 idname - 属性 的 namevalue - 属性 的 valueunit - 属性 的 单位"""id: strname: strvalue: Union[str, Tuple[str, str]]unit: Optional[str] = None

函数参数

类型注释中比较常用的场景之一,对于参数列表中的各个参数做注释。

如有一段解析某 xml 的函数,其入参即为 xml的绝对路径,因此在相关逻辑中,即可将参数标记为str:

def parse_xml(xml_path: str):...

函数返回类型

类型注释中比较常用的场景之一,用于标记某函数到底返回了什么类型的参数。

在Python中定义函数时:

def func_name(param_list):func_impl

对于返回值的注释,放在函数定义的圆括号之后,冒号之前并且写法是:-> type

如有一个比对两个类型为float的数据是否相等的逻辑,返回值类型应为 bool,则函数定义为:

def compare_float(a: float, b: float) -> bool:"""对比两个float是否相等Parameters:a - 需对比的第一个float数值b - 需对比的第二个float数值Returns:如果两个float相等则返回 True, 否则返回 False"""...

效果

  • 给出类型提示

image.png

当写完一个函数名称之后,Pycharm会自动提醒该写入的参数类型

  • 给出错误提示

以函数,当指定一个参数的类型之后,若实际传递的参数类型与标注不符,则会得到提示:

image.png

参考资料

  • typing — Support for type hints — Python 3.8.20 documentation

相关文章:

  • 如何确定微服务的粒度与边界
  • C++抽象类与多态实战解析
  • 算法训练第八天
  • Vue Router 导航方法完全指南
  • 【使用 Loki + Promtail + Grafana 搭建轻量级容器日志分析平台】
  • dxf、dwg中文字矩阵变换
  • 安装 Nginx
  • QT链接其他项目的C++文件报链接错误
  • sifli 52 反馈standby待机rc10k 15秒校准起来后,底电流会变大
  • 交叉熵的意义
  • Linux-linux和windows创建新进程的区别以及posix_spawn
  • 04.两数之和
  • 数据库同步是什么意思?数据库架构有哪些?
  • 《AI角色扮演反诈技术解析:原理、架构与核心挑战》
  • Linux基础开发工具——yum工具
  • QML技术优势
  • day21 常见的降维算法
  • 英国2025年战略防御评估报告:网络与电磁域成现代战争核心
  • 【学习笔记】Python金融基础
  • Linux 云服务器部署 Flask 项目(含后台运行与 systemd 开机自启)
  • 网站建设报销属于什么会计科目/标题关键词优化技巧
  • 合肥网站推广优化/百度推广竞价
  • wordpress收费吗/优化网络推广外包
  • 西安的软件公司哪个比较厉害/宁波正规站内优化seo
  • 上海网站建设微信开发/站长素材网站
  • 北京建立网站/坚决把快准严细实要求落实到位