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 中会给出提示:
类成员
对类中各个成员的类型的注释与普通变量的注释格式相同,如定义一个表示属性的结构:
@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"""...
效果
- 给出类型提示
当写完一个函数名称之后,Pycharm会自动提醒该写入的参数类型
- 给出错误提示
以函数,当指定一个参数的类型之后,若实际传递的参数类型与标注不符,则会得到提示:
参考资料
- typing — Support for type hints — Python 3.8.20 documentation