S1.8 类型注解

类型注解 Why&What

为什么要使用类型注解

  1. 当我们调用random模块中的randint方法时,将光标置于括号中查看提示会显示

显然它的意思是说我们要传入一个整数int参数

  1. 但当我们自己定义一个函数时,提示却只告诉我们任何参数any,如果这个函数是用来进行特定操作的话就容易弄错传参类型,

什么是类型注解

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

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

主要功能:

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

支持:

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

类型注解注释一个提高代码可读性的备注,写错了也不影响程序的实际运行。

变量的类型注解

基础语法:变量:类型

基础数据类型注解

1
2
3
4
name: str = '小明'
age: int = 10
if_student: bool = True
average_money: float = 10.445

基础数据类型注解

1
2
3
class Student:
    pass
stu: Student = Student()

基础容器类型注解(简易)

简易版就是只注解容器的类型

1
2
3
4
5
my_list:list = [1,2,3]
my_tuple:tuple = (1,2,3)
my_set:set = {1,2,3}
my_dict:dict = {'retr0':123}
my_str:str = 'retr0'

基础容器类型注解(详细)

1
2
3
4
my_list:list[int] = [1,2,3]
my_tuple:tuple[str,int,boll] = ('retr0',1,True)
my_set:set[int] = {1,2,3}
my_dict:dict[str,int] = {'retr0':123}

详细注解需要注解容器内部元素的类型,并且注意:

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

其他语法格式

还有一种注解方法就是在对应行的注释中进行类型注解,语法:# type:类型

1
2
3
4
5
6
a = random.randint(1,10)	# type:int
# 指返回的结果是整数
b = json.loads(data)		# type:dict[str,int]
# 指返回的结果是字典
c = func()					# type:Student
# 指返回的结果是Student的类对象

并且实际上一般情况下我们不用特别对变量进行注解(毕竟我们也能一眼看出来到底是什么数据类型),真正需要注解的就是像上面这种的隐式变量,因为我们无法直接看出其数据类型。

函数和方法的类型注解

函数(方法)的类型注解 — 形参注解

语法:

1
2
def 函数方法名(形参名类型形参名类型):
    示例语句

QuickStart:

1
2
3
4
5
def add(x:int,y:int):
    return x + y

def func(data:list):
    pass

函数(方法)的类型注解 — 返回值注解

语法:

1
2
def 函数方法名(形参名类型形参名类型) -> 返回值类型:
    示例语句

QuickStart:

1
2
3
4
5
def add(x:int,y:int) -> int:
    return x + y
def func(data:list) -> list:
    data.append('test')
    return data

Union联合类型注解

为什么要有Union类型注解?

如果数据容器是下面这样的,你还好进行一般注解吗?

1
2
my_list = [1,2,'retr0','hello']
my_dict = ['name':'retr0','age':18]

使用方法

首先导入Union包from typing import Union

语法:Union[类型,类型,......,类型]

演示:变量注解

1
2
3
from typing import Union
my_list: list[Union[int,str]] = [1,2,'retr0','hello']
my_dict:dict[str,Union[str,int]] = ['name':'retr0','age':18]

演示:返回值注解

1
2
3
from typing import Union
def func(data:Union[int,str]) -> Union[int,str]:
    pass
Licensed under CC BY-NC-SA 4.0
已存在于互联网
发表了126篇文章 · 总计210.25k字
萌ICP备20267077号
Powered by ctOS