为什么需要类型注解
在PyCharm中编写代码,我们经常能够见到如下提示:
自动提示可用方法
思考,为什么PyCharm工具能够做到这一点?
它是如何知道这个对象有append方法?
因为:PyCharm确定这个对象,是list类型
同样,我们换一份代码:
定义一个函数func,接收一个参数data
你会发现,PyCharm不会在做出任何提示了
思考,为什么PyCharm工具无法提示了?
因为:PyCharm不确定这个对象是什么类型
又或者当我们调用方法,进行传参的时候(快捷键ctrl + p弹出提示):
为什么内置模块random的方法可以提示类型
自己定义的就不可以?
因为PyCharm无法通过代码
确定应传入什么类型
我们需要使用类型注解
类型注解
Python在3.5版本的时候引入了类型注解,以方便静态类型检查工具,IDE等第三方工具。
类型注解:在代码中涉及数据交互的地方,提供数据类型的注解(显式的说明)。
主要功能:
- 帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
- 帮助开发者自身对变量进行类型注释
支持:
- 变量的类型注解
- 函数(方法)形参列表和返回值的类型注解
类型注解的语法
除了使用 变量: 类型, 这种语法做注解外,也可以在注释中进行类型注解。
语法: # type: 类型
# 在注释中进行类型注解
# 类对象类型注解
class Student:
pass
def func():
pass
var_1 = random.randint(1, 10) # type: int
var_2 = json.loads('{"name": "zhangsan"}') # type: dict[str, str]
var_3 = func() # type: Student
基础容器类型注解
my_list: list = [1, 2, 3]
my_tuple: tuple = (1, 2, 3)
my_set: set = {1, 2, 3}
my_dict: dict = {"itheima": 666}
my_ste: str = "abcdefghigh"
容器类型详细注解
my_list: list[int] = [1, 2, 3]
my_tuple: tuple[int, str, bool] = (1, "itheima", True)
my_dict: dict[str, int] = {"itheima": 666}
my_set: set[int, str] = {1, 2, "a"}
注意:
- 元组类型设置类型详细注解,需要将每一个元素都标记出来
- 字典类型设置类型详细注解,需要2个类型,第一个是key第二个是value
变量的类型注解
为变量设置注解,显示的变量定义,一般无需注解:
my_list: list = [1, 2, 3]
my_tuple: tuple = (1, 2, 3)
my_set: set = {1, 2, 3, "a"}
my_dict: dict = {"itheima": 666}
my_str: str = "abcdefghigh"
my_student: Student = Student()
就算不写注解,也明确的知晓变量的类型
# 一般,无法直接看出变量类型之时
# 会添加变量的类型注解
class Student:
pass
var_1 = random.randint(1, 10)
var_2 = json.loads('{"name": "zhangsan"}')
var_3 = func()
类型注解的限制
类型注解主要功能在于:
- 帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
- 帮助开发者自身对变量进行类型注释(备注)
并不会真正的对类型做验证和判断。
也就是,类型注解仅仅是提示性的,不是决定性的
如图代码,是不会报错的哦。
总结:
1. 什么是类型注解,有什么作用?
在代码中涉及数据交互之时,对数据类型进行显式的说明,可以帮助:
- PyCharm等开发工具对代码做类型推断协助做代码提示
- 开发者自身做类型的备注
2. 类型注解支持:
- 变量的类型注解
- 函数(方法)的形参和返回值的类型注解
3. 变量的类型注解语法
- 语法1: 变量: 类型
- 语法2: 在注释中,# type: 类型
4. 注意事项
- 类型注解只是提示性的,并非决定性的。数据类型和注解类型无法对应也不会导致错误
函数(方法)的类型注解
函数(方法)的类型注解 - 形参注解
如图所示:
- 在编写函数(方法),使用形参data的时候,工具没有任何提示
- 在调用函数(方法),传入参数的时候,工具无法提示参数类型
这些都是因为,我们在定义函数(方法)的时候,没有给形参进行注解
函数和方法的形参类型注解语法:
函数(方法)的类型注解 - 返回值注解
同时,函数(方法)的返回值也是可以添加类型注解的。 语法如下:
总结:
1. 函数(方法)可以为哪里添加注解?
- 形参的类型注解
- 返回值的类型注解
2. 函数(方法)的类型注解语法?
注意,返回值类型注解的符号使用: ->
Union类型 (联合)
使用Union[类型, ......, 类型]
可以定义联合类型注解
my_list: list = [1, 2, 3]
my_dict: dict[str: int] = {"a": 0, "b": 2}
my_dict: dict[str: int] = {"a": 0, "b": 2}
my_list = [1, 2, 3, "a", "b"]
使用Union联合注解
# 使用Union类型,必须先导包
from typing import Union
my_dict: dict[str:Union[str:int]] = {"a": 0, "b": 2, "c": "d"}
my_list: list[Union[int, str]] = [1, 2, "itheima", "itcast"]
Union联合类型注解,在变量注解、函数(方法)形参和返回值注解中,均可使用。
总结:
1. 什么是Union类型?
使用Union可以定义联合类型注解
2. Union的使用方式
- 导包:from typing import Union
- 使用:Union[类型, ......, 类型]