1. 基本知识
Python Type Hints 是 Python 3.5 引入的一种静态类型检查机制,它允许程序员在代码中添加类型信息,以提高代码的可读性、可维护性和安全性
以下是关于 Python Type Hints 的详细分析
Python Type Hints 的语法结构主要包括以下几个部分:
一、基本类型注释:
使用简单的基本类型表示变量的类型,如 int、float、str、bool 等
x: int = 5
y: str = "hello"
二、Union(联合类型):
表示变量可以是多种类型中的一种
from typing import Union
x: Union[int, float] = 3.5
三、List、Tuple、Dict 等容器类型注释:
表示变量是某种容器类型,并可选地指定容器内元素的类型
from typing import List, Tuple, Dict
list_of_ints: List[int] = [1, 2, 3]
tuple_of_str_int: Tuple[str, int] = ("hello", 5)
dict_of_str_float: Dict[str, float] = {"pi": 3.14, "e": 2.71}
四、函数类型注释:
表示函数参数和返回值的类型
def add(x: int, y: int) -> int:
return x + y
五、Callable 类型注释:
表示变量是可调用对象,并指定参数和返回值类型
from typing import Callable
func: Callable[[int, int], int] = add
通过上述例子,总体优缺点如下:
优点
- 提高代码可读性和可维护性:类型注释可以清晰地表达代码的意图,使其他开发者更容易理解代码
- 静态类型检查:使用类型注释结合类型检查工具(如 mypy)可以在编译阶段捕获类型错误,提高代码质量和安全性
- 自文档化:类型注释可以作为代码的自文档,帮助开发者了解函数和变量的预期使用方式
缺点自然而然是增加了代码量,让代码看起来更复杂(不过可以用来装13)
2. Demo
为了展示使用Type Hints以及没使用Type Hints的差异
以下为两个Demo示例:
第一次调用时,传入一个整数列表,函数正常工作
但第二次调用时,传入了一个字符串列表,函数也能够执行,但返回的结果可能与预期不符,因为函数没有对传入的参数类型进行验证
def double_numbers(numbers):
return [x * 2 for x in numbers]
# 调用 double_numbers 函数时,传入一个列表
result1 = double_numbers([1, 2, 3])
print(result1) # Output: [2, 4, 6]
# 再次调用 double_numbers 函数时,传入一个字符串列表
result2 = double_numbers(["hello", "world"])
print(result2) # Output: ['hellohello', 'worldworld']
第一次调用时,传入了一个整数列表,符合函数预期的参数类型,因此没有问题
但是第二次调用时,传入了一个字符串列表,这与函数的预期类型不符,会导致类型检查工具(如 mypy)报错
这样可以在编译阶段就发现类型错误,避免在运行时产生意外的行为
from typing import List
def double_numbers(numbers: List[int]) -> List[int]:
return [x * 2 for x in numbers]
# 类型正确的调用
result1 = double_numbers([1, 2, 3])
print(result1) # Output: [2, 4, 6]
# 类型错误的调用
result2 = double_numbers(["hello", "world"])
# 会在运行 mypy 时抛出错误:Argument 1 to "double_numbers" has incompatible type "List[str]"; expected "List[int]"