Python 中的类型提示
- 什么是 Python 中的类型提示
- 如何向 Python 变量添加类型提示
- 在 Python 中如何为函数添加类型提示(函数注解)
- Python 中的打字模块
-
在 Python 中如何通过
mypy
库使用类型提示 - 在 Python 中为什么我应该使用类型提示
- 在 Python 中为什么我应该避免使用类型提示
- 在 Python 中如何使用类型注释
- 结论
类型提示是 Python 3.5 发布的一项新功能,它允许你在代码中静态指示变量的数据类型。
Python 语言是动态类型的,在特定情况下会导致错误,并在较长的程序中导致不必要的编码问题。
由于 Python 语言的动态特性,推断或检查对象的类型很困难,这可以通过 Python 的类型提示来解决。
什么是 Python 中的类型提示
在 Python 中为用户指定新概念中的数据类型。数据类型是 C、C++ 和 Java 中的一个流行概念。
这种编程语言的静态特性意味着编译器在执行代码之前执行类型检查。
Python 的动态特性意味着它是在运行时编译的。PEP 484
在 Python 中引入了类型提示,用于对代码进行静态类型检查。Python 中的类型提示定义了变量的数据类型和函数的返回类型。
如何向 Python 变量添加类型提示
你可以通过以下方式声明变量后跟:
和数据类型来快速向变量添加类型提示。你也可以在提及数据类型后初始化变量的值。
val1: float = 4.71
print(val1)
val2: str = "Example of String"
print(val2)
val3: bool = True
print(val3)
lis1: list = ["p", "q", "r"]
print(lis1)
tup1: tuple = (47, 55, 30)
print(tup1)
dic1: dict = {"John": 98, "Frank": 99, "Lisa": 100}
print(dic1)
输出:
4.71
Example of String
True
['p', 'q', 'r']
(47, 55, 30)
{'John': 98, 'Frank': 99, 'Lisa': 100}
在 Python 中如何为函数添加类型提示(函数注解)
你可以通过在变量后添加 :
并指定数据类型来轻松地向任何函数添加类型提示。你可以通过以下方式定义函数后添加 ->
来指定返回数据类型。
def product(no1: int, no2: int) -> int:
return no1 * no2
print(product(6, 4))
输出:
24
Python 3.0 中提供了函数注解,类型提示使用这些注解为方法提供返回值。添加返回数据类型不会阻碍函数的执行。
你可以将 None
用于不返回任何内容的函数。你可以使用 typing
模块中的 Union
来指定多个数据类型。
Python 中的打字模块
在 Python 中,类型提示通过 Python 3.5 中引入的 typing
模块提供了更多的功能。Python 的 typing
模块允许你明确指定数据类型。
你可以定义整数的元组
,浮点数的列表
,并且更有效,如下所示。
from typing import List, Tuple, Dict
lis1: List[int] = [70, 18, 29]
print(lis1)
tup1: Tuple[float, int, int] = (21.52, 2, 3)
print(tup1)
dic1: Dict[int, str] = {1: "Type Hints", 2: "Python"}
print(dic1)
输出:
[70, 18, 29]
(21.52, 2, 3)
{1: 'Type Hints', 2: 'Python'}
typing
模块提供对类型提示的支持,包括:
类型别名
Type Aliases 允许你指定一个单词,你可以将其交替用作别名以简化代码,如图所示。
Vector = List[float]
NewType
NewType
辅助类可以很容易地发现逻辑缺陷。
RollNo = NewType("RollNo", int)
泛型
抽象基类已得到增强,以支持订阅以指示容器组件的预期类型,因为容器中保存的对象的类型信息不能一般地静态推断。
X = TypeVar("X")
Any
类型
Any
类型是与其他所有类型兼容的特殊数据类型。当你的代码需要动态和静态行来指示变量需要动态类型的值时,使用任何
。
x: Any = "Python"
Union
Union
运算符允许你在不显示任何警告的情况下接受和返回指定的数据类型。你还可以使用 Union
运算符在 Python 中选择一种以上的数据类型。
def numsqr(n1: Union[float, int]) -> Union[float, int]:
return n1 ** 2
你可以在 Python 3.10 及更新版本中使用|
轻松定义 Union,如下所示。
def numsqr(n1: float | int) -> float | int:
return n1 ** 2
在 Python 中如何通过 mypy
库使用类型提示
Python 的 mypy
库允许你在运行时强制进行类型检查。PEP 484
不强制使用类型提示的任何约束,仅提供执行类型检查要遵循的指示和指南。
无论注释或类型提示的数量或存在如何,所有代码片段都可以顺利运行,因为 Python 不使用它们。你可以使用 pip
或 conda
安装 mypy
库。
pip install mypy
conda install mypy
使用 mypy
库可以通过执行类型检查和在运行时发出警告来帮助你更轻松地编码。Mypy
引发警告,解释在特定行中数据类型的错误使用,如下所示。
def findsqr(n1: int) -> int:
return n1 ** 2
if __name__ == "__main__":
print(findsqr(4))
print(findsqr(4.5))
没有 mypy
的输出:
16
20.25
使用 mypy
输出:
main.py:5: error: Argument 1 to "findsqr" has incompatible type "float"; expected "int"
Found 1 error in 1 file (checked 1 source file)
在 Python 中为什么我应该使用类型提示
Python 的 mypy
库和类型提示为开发人员提供了一些好处,包括:
- 代码文档 - 类型提示可以更好地记录你的代码,因此引用它的其他人可以快速获取它,因为已经指定了变量和函数的数据类型。
- 增加 IDE 和工具支持 - 如果你在代码中使用了类型提示,IDE(集成开发环境)可以提供更好的代码完成建议、方法和属性。
- 轻松调试 - Python 中的类型提示使查找和纠正错误更容易,因为 mypy 可以查明错误的确切位置。类型提示还为大型项目中的大代码块创建了一个干净的流程,提供了更原始的架构。
在 Python 中为什么我应该避免使用类型提示
Python 的类型提示为开发人员提供了许多优点,但也有一些缺点,例如:
- 增加编码 - 额外的代码行,特别是包含变量的代码,将包含在类型提示中,从而导致更大的工作量和代码长度。
- 不支持的版本 - 类型提示为 Python 3.5 或更高版本提供了出色的体验,因为旧版本的 Python(Python 3 之前)不运行变量注释。类型注释可以在旧版本的 Python 中使用,以使用变量注释和类型提示。
在 Python 中如何使用类型注释
Python 中的类型注释是特殊注释,允许你使用注释字典中不可用的注释在旧版本中添加类型提示。
类型注释的语法如下。
def circle_area(r):
# type: (float) -> float
return 3.14 * r * r
如上所示,你可以在旧版本中添加类型注释作为折衷方案,但 Python 建议使用类型提示。
结论
我们在本文中讨论了 Python 中的 Type Hints 和类型化模块。类型提示通过提供静态代码检查来提供其他编程语言的优势。
Python 中的类型提示是改进代码文档和可读性的绝佳方式。类型提示在调试代码时也能极大地帮助你并让其他人很好地理解它。
但是,类型提示会使你的代码更长,这是可以避免的,因为 Python 以其简洁明了的结构而闻名。
类型提示提供了一种更简洁的编码方法,并允许你更好地定义代码和功能的体系结构。