PEP 484 中引入了 Python 类型提示,以将静态类型的优势引入动态类型语言。尽管类型提示在运行时不强制执行类型检查,但它们提供了一种指定预期类型的变量、函数参数和返回值的方法,这些类型可以通过静态分析工具(如 mypy)进行检查。这增强了代码的可读性,便于调试,并提高了代码的整体可维护性。
Python 中的类型提示使用函数参数、返回值和变量赋值的注释。
Python 的类型提示可用于指定各种类型,例如基本数据类型、集合、复杂类型和自定义用户定义类型。typing 模块提供了许多内置类型来表示这些不同的类型 -
- 基本数据类型
- 集合类型
- 可选类型
- 联合类型
- 任何类型
- 类型别名
- 泛型类型
- 可调用类型
- 文本类型
- NewType (新类型)
让我们一个接一个地详细看看每一个。
基本数据类型
在 Python 中,当使用类型提示指定基本类型时,我们可以简单地使用类型的名称作为注释。
例以下是使用基本数据类型(如整数、浮点数、字符串等)的示例 -
在执行上述代码时,我们将得到以下输出 -
28.259999999999998
Hello, Alice
True
This function does not return anything
5.0
None
None
集合类型
在 Python 中,当在类型提示中处理列表、元组、字典等集合时,我们通常使用 typing 模块来指定集合类型。
例下面是使用 in 类型提示的 Collections 的示例 -
在执行上述代码时,我们将得到以下输出 -
(3.0, 4.0)
{'apple': 2, 'banana': 1, 'orange': 1}
{'l', 'e', 'h', 'o'}
0
1
2
3
4
[0, 1, 4, 9, 16]
可选类型
在 Python 中,Optional 类型用于指示变量可以是指定类型或 None。当函数可能并不总是返回值,或者当参数可以接受值或未指定时,这特别有用。
例以下是在类型提示中使用可选类型的示例 -
在执行上述代码时,我们将得到以下输出 -
None
联合类型
Python 使用 Union 类型来允许变量接受不同类型的值。当函数或数据结构可以处理各种类型的输入或生成不同类型的输出时,这非常有用。
例下面是这个例子 -
在执行上述代码时,我们将得到以下输出 -
None
任何类型
在 Python 中,Any type 是一种特殊的类型提示,指示变量可以是任何类型。它实质上禁用了该特定变量或表达式的类型检查。这在事先不知道值类型或处理动态数据的情况下非常有用。
例以下是在 Type hint 中使用 Any type 的示例 -
在执行上述代码时,我们将得到以下输出 -
hello
True
[1, 2, 3]
{'key': 'value'}
类型别名
Python 中的类型别名用于为现有类型提供替代名称。它们可以通过为复杂的类型注释或类型组合提供清晰的名称来使代码更易于阅读。这在使用嵌套结构或长类型提示时特别有用。
例以下是在 Type hint 中使用 Type Aliases 的示例 -
在执行上述代码时,我们将得到以下输出 -
5.0
泛型类型
泛型类型创建可以处理任何类型的函数、类或数据结构,同时保持类型安全。typing 模块的 TypeVar 和 Generic 结构使这成为可能。它们有助于制作可重用的组件,这些组件可以在不影响类型检查的情况下处理各种类型的组件。
例这是它的示例 -
在执行上述代码时,我们将得到以下输出 -
apple
可调用类型
Python 的 Callable 类型用于显示类型是函数或可调用对象。它位于 typing 模块中,可让您定义参数的类型和函数的返回类型。这对于高阶函数很方便。
例以下是在类型提示中使用 Callable 类型的示例 -
在执行上述代码时,我们将得到以下输出 -
15
文本类型
Literal 类型用于指定值必须恰好是一组预定义值之一。
例下面是示例 -
在执行上述代码时,我们将得到以下输出 -
Moving up
NewType (新类型)
NewType 是 typing 模块中的一个函数,它允许我们创建从现有类型派生的不同类型。这对于通过区分同一底层类型的不同用途来为代码添加类型安全非常有用。例如,我们可能希望区分用户 ID 和产品 ID,即使两者都表示为整数。
例下面是示例 -
在执行上述代码时,我们将得到以下输出 -
Product with ID 101