一、学前花絮

我们之前说过,好的程序员编写程序,要有注释。比如你编写一个函数,最好开头要用文字说明一下这个函数有什么功能。而本篇文章所说的类型注解与注释的作用类似,只不过类型注解是在程序块内,而注释是程序的文字说明。

想象一下,你给朋友寄一个包裹。如果你在包裹上写明’易碎品’和’向上箭头’,快递员就会知道要小心轻放、正确朝向。类型注解(Type Hints) 在编程中就扮演着类似的角色——它是一种为代码添加’说明标签’的技术,明确地指出变量、函数参数和返回值应该是什么数据类型。

二、Python 类型注解

2.1 类型注解的例子

简单来说,类型注解就是在代码中注明数据类型的语法,它的核心目的是:

  • 提高代码可读性:让他人(以及未来的你)一眼就能看懂代码的意图。
  • 便于静态检查:在运行代码前,通过工具发现潜在的类型错误。
  • 增强IDE支持:让代码编辑器提供更准确的自动补全和提示。

一个简单的例子::

第二段代码明确指出了 name 应该是字符串类型(str),函数会返回一个字符串(-> str)。

2.2 为什么需要类型注解?

Python 以其动态类型特性而闻名——你不需要提前声明变量的类型,解释器会在运行时自动推断。这虽然灵活,但也带来了问题:

代码难以理解:看到一个函数时,不清楚应该传入什么类型的数据

隐藏的bug:可能不小心传入了错误类型,直到运行时才报错

开发效率低:IDE无法提供准确的代码提示和补全

类型注解通过提供可选的类型信息来解决这些问题,让你的代码更加健壮和可维护。

2.3 类型注解的基础语法详解

2.3.1 变量注解

从 Python 3.6 开始,你可以直接为变量添加类型注解:

说明:name: str 读作’变量 name 的类型是 str’。

2.3.2 函数注解

在函数参数后加 : 类型。

解读这个函数:

first_name: str:参数 first_name 应该是字符串。

last_name: str:参数 last_name 应该是字符串。

-> str:这个函数执行后会返回一个字符串。

现在,任何人调用这个函数时,都能清晰地知道需要传递什么,以及会得到什么。

函数注解是类型注解最常见的应用场景:

2.3.3 参数默认值

你可以同时使用类型注解和默认值:

2.3.4 复杂类型注解

基本的 str, int, list 很好用,但如果我们想表达’一个由整数组成的列表’该怎么办?这时就需要 Python 的 typing 模块提供更强大的工具。

列表、字典等容器类型

可选类型(Optional)

当值可能是某种类型或者是 None 时使用:

Python学习【26】:Python 类型注解(Type Hints)

联合类型(Union)

当值可能是多种类型之一时使用:

2.4 类型检查实战

2.4.1 使用 Mypy 进行静态类型检查

Mypy 是最流行的 Python 类型检查器。首先安装它:

pip install mypy

假设我们有一个有潜在类型问题的文件 example.py:

运行 mypy 检查,你会发现提示如下错误信息:

2.4.2 在 IDE 中实时检查

现代 IDE(如 VS Code、PyCharm)都内置了类型检查支持:

  1. 错误高亮:类型不匹配的代码会被标记出来
  2. 智能提示:输入代码时会显示参数和返回值的类型信息
  3. 自动补全:基于类型信息提供更准确的代码补全建议

2.4.3 如何掌握类型注解这一功能

1. 渐进式采用

从新代码开始使用类型注解

逐步为重要的旧代码添加注解

不需要一次性为所有代码添加类型

2. 保持一致性

在项目中保持统一的注解风格

团队协商决定注解的详细程度

3.避免过度注解

# 不推荐:过于明显的类型不需要注解

x: int = 5 # 5明显是整数,可以省略注解

# 推荐:为复杂逻辑或公共接口添加注解

def calculate_statistics(data: List[float]) -> Dict[str, float]:

”’计算数据的各种统计指标”’

# 下面是复杂实现…

2.5 总结与实践

类型注解是提升代码质量的强大工具。让我们通过一个综合练习来巩固所学:

输出结果为:

三、小结

今天我们学习了python语言的类型注解功能。这部分内容属于基础知识之上的功能,也就是说你在编写程序的时候可以没有类型注解,完全可以运行成功。但对于一个专业的程序员来说,通常会在一个大的工程项目中承担工作,如果所有人写的代码都没有类型注解,时间长了,连自己读起来都会困难。

之前的文章提到写程序要有注释,包括单行注释和多行注释。注解和注释还是有区别的,注释纯粹是文本,可以描述程序做什么事情。而注解是在程序代码块内,更清晰表达程序的意图。

让我们保持学习热情,多做练习。我们下期再见!

快乐男孩

#python#