Python第十二章 类型注解

第十二章 类型注解

12.1 类型注解的作用

为什么要类型注解

1、在已知类型的情况下,IDE是会进行补全提示的

image-20230928105032183

但是在未知的类型情况下,是没有提示的,因为IDE无法推断出类型

image-20230928105111588

2、又或者当我们调用方法,进行传参的时候(快捷键ctrl + p弹出提示):

image-20230928105357010

但是自定义的方法可能会不知道

image-20230928105437189

因为PyCharm无法通过代码确定应传入什么类型,我们需要使用类型注解


Python在3.5版本的时候引入了类型注解,以方便静态类型检查工具,IDE等第三方工具

类型注解:在代码中涉及数据交互的地方,提供数据类型的注解(显式的说明)。

主要功能:

  1. 帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
  2. 帮助开发者自身对变量进行类型注释

【说明】类型注解的作用主要还是为了观看代码使用的,但是对代码逻辑并没有实际影响

支持:变量的类型注解、函数(方法)形参列表和返回值的类型注解

12.2 变量的类型注解

分为 语法注解注释注解

【语法注解】

1、基础数据类型注解

var_1: int = 10
var_2: float = 3.1415
var_3: bool = True
var_4: str = "hello,world"

2、类对象类型注解

class Student:
    pass
student: Student = Student()

【说明】这两种一般无需注解,就算不写注解,也明确的知晓变量的类型

3、基础容器类型注解

my_list: list = [1, 2, 3]
my_tuple: tuple = (1, 2, 3)
my_set: set = {1, 2, 3}
my_dict: dict = {"key1": 1, "key2": "val2"}
my_str: str = "hello"

4、容器类型详细注解(注解元素的类型)

my_list: list[int] = [1, 2, 3]
my_tuple: tuple[str, int, bool] = ("str", 2, True)
my_set: set[int] = {1, 2, 3}
my_dict: dict[str, int] = {"key1": 1, "key2": "val2"}

【注意】

  1. 元组类型设置类型详细注解,需要将每一个元素都标记出来
  2. 字典类型设置类型详细注解,需要2个类型,第一个是key第二个是value

【注释注解】

除了使用 变量: 类型, 这种语法做注解外,也可以在注释中进行类型注解。

var_1 = random.randint(1, 10)  # type: int
var_2 = json.loads("{mary: 1}") # type: dict[str, int]
var_3 = Student() # type: Student

【说明】一般,无法直接看出变量类型之时,会添加变量的类型注解

12.3 函数/方法的类型注解

image-20230928105437189

如图所示:

  • 在编写函数(方法),使用形参data的时候,工具没有任何提示
  • 在调用函数(方法),传入参数的时候,工具无法提示参数类型

这些都是因为,我们在定义函数(方法)的时候,没有给形参进行注解


函数的类型注解分为两种:形参的类型注解返回值的类型注解

下面逐一说明

12.3.1 形参的类型注解

注解语法

def func(param1: type1, param2: type2, ....):
	pass

演示如下

image-20230928112318178

image-20230928112336928

12.3.2 返回值类型注解

注解语法

def func(param1: type1, param2: type2, ....) -> return_type:
	pass

image-20230928112502788

12.4 类型注解不起作用

类型注解主要功能在于:

  1. 帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
  2. 帮助开发者自身对变量进行类型注释(备注)

并不会真正的对类型做验证和判断。也就是,类型注解仅仅是提示性的,不是决定性的,不会对业务起作用

如下的情况并不会报错

var_1: str = 1
var_2: int = "str"

12.5 Union类型注解

上面展示过的类型注解

my_list: list[int] = [1, 2, 3]
my_set: set[int] = {1, 2, 3}
my_dict: dict[str, int] = {"key1": 1}

比如list[int]表示list里面只有int类型,如果还想有其他类型呢?

my_list = [1, 3, "hello"]
my_dict: dict[str, int] = {"key1": 1, "key2": "val2"}

可以使用Union[type1, type2, ..]

from typing import Union

my_list: list[Union[int, str]] = [1, 2, "str1", "str2"]
my_dict: dict[str, Union[str, int]] = {"key1": "val1"}
print(my_list)
print(my_dict)

list[Union[int, str]]表示list中的类型只有int和str两种类型

【使用说明】要从typing模块中导入Union这个包,并且Union[]使用的符号是中括号

from typing import Union
def func() -> Union[int, str]:
    pass
posted @ 2023-10-07 11:40  Crispy·Candy  阅读(46)  评论(0编辑  收藏  举报