python 变量类型标注

news/2024/11/17 23:56:58/

目录

一、概述

1、描述

2、常用的数据类型

3、mypy模块

二、使用

1、基本使用

2、函数参数返回值添加类型标注

1. 指定多个参数的方式

2. Callable

3. Iterator

2、混合类型检查改进

1.联合运算符

3、类型别名更改


一、概述

1、描述

        变量类型注解是用来对变量和函数的参数返回值类型做注解,让调用方减少类型方面的错误,也可以提高代码的可读性和易用性。

        但是,变量类型注解语法传入的类型表述能力有限,不能说明复杂的类型组成情况,因此引用了typing模块,来实现复杂的类型表达。

2、常用的数据类型

TypeDescription
int整型 integer
float浮点数字
bool布尔(int 的子类)
str字符 (unicode)
bytes8 位字符
object任意对象(公共基类)
List[str]字符组成的列表
Tuple[int, int]两个int对象的元组
Tuple[int, ...]任意数量的 int 对象的元组
Dict[str, int]键是 str 值是 int 的字典
Iterable[int]包含 int 的可迭代对象
Sequence[bool]布尔值序列(只读)
Mapping[str, int]从 str 键到 int 值的映射(只读)
Any具有任意类型的动态类型值
Union联合类型
Optional参数可以为空或已经声明的类型
Mapping映射,是 collections.abc.Mapping 的泛型
MutableMappingMapping 对象的子类,可变
Generator生成器类型, Generator[YieldType、SendType、ReturnType]
NoReturn函数没有返回结果
Set集合 set 的泛型, 推荐用于注解返回类型
AbstractSetcollections.abc.Set 的泛型,推荐用于注解参数
Sequencecollections.abc.Sequence 的泛型,list、tuple 等的泛化类型
TypeVar自定义兼容特定类型的变量
Generic自定义泛型类型
NewType声明一些具有特殊含义的类型
Callable可调用类型, Callable[[参数类型], 返回类型]
NoReturn没法返回值

3、mypy模块

  • mypy是Python的可选静态类型检查器

  • 安装mypy模块 pip3 install mypy

  • 使用mypy进行静态类型检查 mypy 执行 python 文件

二、使用

1、基本使用

from typing import List, Set, Dict, Tuple
#对于简单的 Python 内置类型,只需使用类型的名称
x1: int = 1
x2: float = 1.0
x3: bool = True
x4: str = "test"
x5: bytes = b"test"# 对于 collections ,类型名称用大写字母表示,并且
# collections 内类型的名称在方括号中
x6: List[int] = [1]
x7: Set[int] = {6, 7}
#对于映射,需要键和值的类型
x8: Dict[str, float] = {'field': 2.0}
#对于固定大小的元祖,指定所有元素的类型
x9: Tuple[int, str, float] = (3, "yes", 7.5)
#对于可变大小的元祖,使用一种类型和省略号
x10: Tuple[int, ...] = (1, 2, 3)'''在终端执行检查
(venv) D:\python>mypy .\01.py
Success: no issues found in 1 source file
'''

2、函数参数返回值添加类型标注

1. 指定多个参数的方式

'''
定义一个函数   参数 num int类型
返回值 字符串类型
使用mypy检测
'''
def num_fun(num: int) -> str:return str(num)num_fun(100)
print(num_fun(100))# 指定多个参数的方式
def plus(num1: int, num2: int) -> int:return num1 + num2# 在类型注释后为参数添加默认值,默认值需要添加在末尾
'''
声明函数参数时,所有带有默认值的参数必须放在非默认参数的后面。
这是因为 Python 解释器需要确定参数传递的顺序,
如果默认参数放在非默认参数前面,解释器就无法确定哪个参数是哪个
'''
def func1(num1: int, my_float: float = 3.5)-> float:return num1 + my_float
print(func1(10,20))
f = func1
print(f(10))

2. Callable

   Callable 是一个抽象类,用于描述可调用对象的基本行为,例如函数、方法和类。当你声明一个函数变量并将其分配给一个变量时,这个变量只是一个普通的 Python 对象,并不是一个可调用对象,因此它没有默认值

        带有默认值的参数可以放在任何位置,但是在声明函数参数时,所有带有默认值的参数必须放在非默认参数的后面。这是因为 Python 解释器需要确定参数传递的顺序,如果默认参数放在非默认参数前面,解释器就无法确定哪个参数是哪个。

from typing import  Callable
#定义变量  指向一个函数
def func2(num1:int, my_float=3.5) -> str:return f'返回结果{num1 + my_float}'
print(func2(10))
#Callable指向可调用(函数)值的方式
x: Callable[[int, float], str] = func2
print(x(10, 3.5))'''
执行结果
返回结果13.5
返回结果13.5
'''

3. Iterator

#定义函数,产生整数的生成器,每次返回一个
from typing import Iterator
# 产生整数的生成器函数安全地返回只是一个 整数迭代器的函数
#,因此这就是我们对其进行注释的方式
def g(n: int) -> Iterator[int]:i = 0while i < n:yield i #下次迭代时,代码从 yield 的下一条语句(不是下一行)开始执行i += 1print(g(10))
for i in g(10):print(i)'''执行结果
<generator object g at 0x00000000014E88E0>
0
1
2
3
4
5
6
7
8
9
'''

2、混合类型检查改进

1.联合运算符

        联合运算符使用 " | "  线来替代了旧版本中Union[] 方法,使得程序更简洁

#新版本
def get_name(user: str | dict) -> str:if isinstance(user, str):return userelif isinstance(user, dict):return user.get('name', '')
print(get_name({'name':'Bob'}))
print(get_name("Alice"))

        在这个例子中,函数get_name接受一个参数user,它可以是一个字符串或一个字典。如果user是一个字符串,函数会直接返回这个字符串;如果user是一个字典,函数会尝试从字典中获取name字段的值,并返回它。

        在这个例子中,我们使用联合运算符将strdict类型组合起来,表示user可以是这两种类型之一。

#旧版本,Union方法来实现相同的功能
from typing import Union
def get_name2(user: Union[str, dict]) -> str:if isinstance(user, str):return userelif isinstance(user, dict):return user.get('name', '')print(get_name2({'name':'Bob'}))
print(get_name2("Alice"))
'''执行结果
Bob
Alice
'''

3、类型别名更改

#旧版本
oldname = str
def oldFunc(param:oldname) -> oldname:return param + param
oldFunc('oldFunc:花非人陌')#新版本,从3.10后开始支持
from typing import TypeAliasnewstr :TypeAlias = str    #定义类型别名
newint :TypeAlias = int
def func_test(num:newint, msg:newstr)->newstr:return str(num) + msg
print(func_test(100,"类型名称更改"))

http://www.ppmy.cn/news/40989.html

相关文章

matplotlib 齐次坐标系 绘制 2D 闪烁斑点

绘制闪烁的斑点群&#xff0c;需要考虑几个群体属性&#xff1a;群体的生成位置 (xylim)&#xff0c;斑点数量 (n)&#xff0c;斑点的半径均值 (r)&#xff0c;斑点的寿命均值 (delta) 而对于每一个斑点&#xff0c;又需要考虑斑点个体属性&#xff1a;出生时间 (start)、出生位…

Makefile学习6 - 条件判断

一. 前言 条件判断语句可以根据一个变量的值来控制make执行或者忽略Makefile的特定部分。条件语句可以是两个不同变量或者变量与常量值的比较。条件语句只能用于控制make实际执行的Makefile文件部分&#xff0c;不能控制规则的shell的执行过程。Makefile使用条件控制可以做到处…

Java知识点学习(第5天)

重载和重写的区别 重载&#xff1a;发生在同一个类中&#xff0c;方法名必须相同&#xff0c;参数类型不同、个数不同、顺序不同、方法返回值和访问修饰符可以不同&#xff0c;发生在编译的时候。 重写&#xff1a;发生在父子类中&#xff0c;方法名、参数列表必须相同&#…

国货之光!打工人必装的8个软件,你都用过没?|办公|效率|创作

给大家分享8款非常强大&#xff0c;但知名度不高的国产软件&#xff0c;每一个都堪称精品&#xff0c;喜欢的话记得点赞和关注哦~ 第一款是 火绒安全软件 火绒安全软件没有任何&#xff0c;具有推广性质的弹窗、没有捆绑打扰用户的行为&#xff1b;占用资源极少&#xff0c;&a…

【Docker】Docker安装Hadoop分布式集群

Docker安装分布式Hadoop集群 一、准备环境 1. 查看docker的hadoop镜像 docker search hadoop2. 拉取stars最多的镜像 docker pull sequenceiq/hadoop-docker3. 拉取完成后查看镜像是否已到本地 docker images 4. 运行第一个容器hadoop102 docker run --name hadoop102 …

不可变数据类型

不可变对象 不可变(immutable)&#xff1a; 即对象一旦被创建初始化后&#xff0c;内存中该类型的值永远不会改变&#xff0c;之后的每次改变都会产生一个新对象。 作为不可变类型&#xff0c;最主要的特性表现是&#xff1a;一旦创建&#xff0c;只要修改&#xff0c;就会在托…

cv2(OpenCV)下载安装

cv2对应库是OpenCV&#xff0c;官网下载链接&#xff1a;https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv 最好下载对应python版本的&#xff0c;通过pip命令安装可能会出现版本过高或者过低的问题&#xff0c;导致import cv2没问题&#xff0c;但是内部函数无法调用。 …

CSS选择器基础1.1(查找标签)

1&#xff0c;标签选择器&#xff08;以标签名命名的选择器&#xff09; 结构&#xff1a; 标签名{CSS属性名:属性值;} 注&#xff1a;选中所有的这个标签都生效CSS。 2&#xff0c;类选择器 结构&#xff1a; .类名{CSS属性名&#xff1a;属性值;} 作用&#xff1a;通过类…