【Python常用包】typing

news2024/12/26 12:01:08

目录

  • typing
  • 准备工作
  • typing 实践
    • Tuple、List、Dict
      • `Tuple` - 用于定义元组类型的类型注解
      • `Dict` - 用于定义字典类型的类型注解
      • `List` - 用于定义列表类型的类型注解
    • Union
    • Optional
  • 小结


typing

Python 中,typing 模块提供了一些辅助工具来帮助开发者编写类型注解,这是 Python 3.5 新引入的一项功能,允许开发者为变量、函数的参数和返回值指定预期的类型。

如此,不仅有助于提高代码的可读性,还可以在某些情况下帮助识别潜在的编程错误。

本博文中,我们将首先通过案例 “见一见” 这些常用的功能和类,最后通过表格形式做总结。


准备工作

运行代码时,即使把 str 类型值赋给类型注解为 int 类型时,Python 解释器也不会因为类型不匹配而抛出错误,因为在运行时是动态的。

typing 的用法,是搭配静态类型检查工具(如 mypy),在代码分析时进行静态检查类型注解。发现实际值与注解类型不匹配的错误并报告。

因此,我们需要下载安装 typing 库与 mypy 库;

pip install typing
pip install mypy

typing 实践

首先我们从

  • 元组(Tuple)
  • 列表(List)
  • 字典(Dict)

这三个类开始;


Tuple、List、Dict

Tuple - 用于定义元组类型的类型注解

e . g . 1 e.g.1 e.g.1 类型不匹配;

from typing import Tuple
my_tup: Tuple[int] = ("hello")

明显,我们将字符串赋给了类型注解为整型的元组,此时我们使用静态检查工具 mypy 检查:

# Terminal 中执行
mypy .\main.py

报错:

在这里插入图片描述


e . g . 2 e.g.2 e.g.2 数量不匹配;

from typing import Tuple
my_tup: Tuple[int] = (1, 2)

我们标记了一个整型的类型注解,但是元组中却有两个整数,此时我们静态检查工具 mypy 检查:

# Terminal 中执行
mypy .\main.py

报错:

在这里插入图片描述


e . g . 3 e.g.3 e.g.3 类型、数量皆正确;

from typing import Tuple
my_tup: Tuple[int, int] = (1, 2)

类型、数量皆正确,静态检查工具检查:

 mypy .\main.py

结果:

在这里插入图片描述


Dict - 用于定义字典类型的类型注解

from typing import Dict

my_dict_1: Dict[str, int] = {"one": "1", "two": 2}
my_dict_2: Dict[str, int] = {"one": 1, "two": 2}

my_dict_1 错误,my_dict_2 正确:

在这里插入图片描述


List - 用于定义列表类型的类型注解

from typing import List, Any

my_list_1: List[int] = [1, 2, 3, 4]
my_list_2: List[Any] = [1, "two", 3.0]

my_list_1 定义一个包含整数的列表
my_list_2 定义一个泛型列表,可以是任意类型的元素

皆正确:

在这里插入图片描述


Union

在类型注解模块 typing 中,支持使用 Union 表示类型之间的联合,变量可以是多种类型中的任意一种。

from typing import Union

def add_numbers(a: Union[int, float], b: Union[int, float]) -> Union[int, float]:
    return a + b

# 正确的调用
result_int = add_numbers(1, 2)  # 类型为 int
result_float = add_numbers(1.5, 2.5)  # 类型为 float

# 错误的调用
result_mixed = add_numbers(1, "hello")

在上面的例子中,add_numbers 函数接受两个参数,这两个参数可以是 int float 类型。函数返回值也可以是 intfloat 类型。

mypy .\main.py

Python 3.5 及以后的版本中,类型检查器会允许 intfloat 之间的混合运算,因为 intfloat 是相互可转换的类型(在数值上, int 会被转换为 float 进行计算)。但是,如果你需要类型注解来明确地指出不接受混合类型,你可以使用 Union 来明确指出允许的类型。

Python 3.5 之前的版本中,上述代码会报错,因为之前的类型检查器不支持混合类型的操作。如果你使用的是早期版本的 Python,需要确保不要混合使用 intfloat 类型的参数。


Optional

Optional 表示一个值可以是某种类型,或者是 None

换句话说,Optional[X] 等价于 Union[X, None],表示变量可以是类型 X 或者是 None

from typing import Optional

# 函数 greet 中接受一个参数 name,参数可以是 str 类型或者 None
def greet(name: Optional[str] = None) -> str:
    if name is None:
        return "Hello, there!"
    return f"Hello, {name}!"

# 正确的调用
print(greet("Alice"))  # 返回 "Hello, Alice!"
print(greet())  # 返回 "Hello, there!"

# 错误的调用
print(greet(123))

在这个例子中,greet 函数接受一个参数 name,这个参数可以是 str 类型或者是 None。函数的返回值也是一个 str,但在没有提供 name 参数时,它会返回一个通用的问候语。


小结

在使用类型注解时,Python 解释器并不会强制检查这些类型,这意味着即使你指定了类型,Python 也不会在运行时检查这些类型是否匹配。然而,如 mypy 的静态类型检查工具可以利用这些注解来提供更好的代码检查和提示。

所以,类型注解只是 Python 的一种语法糖,它不会影响代码的执行,主要是为了提高代码的可读性和易维护性,同时可以被静态类型检查工具使用来减少bug。

2024.2.22

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1463079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA工程师面试专题-并发编程篇

目录 一、线程 1、并发与并行的区别 2、同步和异步的区别 3、Java中创建线程有哪些方式? 4、Thread和Runnable的区别 5、Java中的Runnable、Callable、Future、FutureTask的区别和联系? 6、说一下你对 CompletableFuture 的理解 7、volatile关键字有什么用&…

css2的三大特性

css的三大特性 一.层叠性概念 二.继承性行高的继承 三. 优先级概念a标签默认蓝色优先级注意事项 一.层叠性 概念 二.继承性 行高的继承 可用倍数表示三. 优先级 概念 a标签默认蓝色 优先级注意事项 例子

基于ExtendSim的半导体制造工厂仿真

这是一个离散事件模型,使用ExtendeSim “高级资源管理(ARM)”功能来组织和分配资源。 此模型使用离散事件仿真和高级资源管理(ARM)功能。ARM是一个集成系统,用于组织资源、区分资源并在整个模型中分配资源。…

java效率为什么比c/c++慢,蓝桥杯上java只得50分,c++通过?

java效率为什么比c/c慢,蓝桥杯上java只得50分,c通过? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「c的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大…

nginx 具体介绍

一,nginx 介绍 (一)nginx 与apache 1, Apache event 模型 相对于 prefork 模式 可以同时处理更多的请求 相对于 worker 模式 解决了keepalive场景下,长期被占用的线程的资源浪费问题 因为有监听线程&#…

[游戏开发][虚幻5]新建项目注意事项

鼠标右键点击Client.uproject文件,可以看到三个比较关键的选项, 启动游戏,生成sln解决方案,切换引擎版本 断点调试 C代码重要步骤 如果你想断点调试C代码,则必须使用使用代码编译启动引擎,你需要做几个操作…

容器_Docker ( 05 )

容器_Docker ( 04 ) K8S管理 集群管理 集群管理命令 kubectl是用于控制Kubernetes集群的命令行工具 语法格式 : kubectl [command] [Type] [Name] [flags] command : 子命令 , 如create , get , describe , delete 查询集群信息管理命令 子命令说明help用于查看命令及子命…

openGauss学习笔记-225 openGauss性能调优-系统调优-配置向量化执行引擎

文章目录 openGauss学习笔记-225 openGauss性能调优-系统调优-配置向量化执行引擎 openGauss学习笔记-225 openGauss性能调优-系统调优-配置向量化执行引擎 openGauss数据库支持行执行引擎和向量化执行引擎,分别对应行存表和列存表。 一次一个batch,读…

C++如何避免float误差?

C如何避免float误差? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「c的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! …

openEuler2203 LTS安装VMware WorkStation Pro 17并远程桌面连接Linux服务器

openEuler 2203 LTS默认只有命令行,没有GUI图形界面,在其中安装VMware WorkStation需要有图形界面的支持。这里以安装深度的DDE桌面环境,最后通过VNC远程桌面连接Linux服务器操作VMware WorkStation。 以下操作请保持网络能正常连接 1、安装…

如何使用idea连接服务器上的mysql?

安全组进行开放 具体步骤 关闭防火墙 开放端口号 重启防火墙 firewall-cmd --reload在mysql进行修改配置 update user set host % where user root;flush privileges;使得其他网络也可以连接这个数据库 另外如果想要sqlyog或者其他图形化界面要连接到数据库可以看下面这…

【论文解读】transformer小目标检测综述

目录 一、简要介绍 二、研究背景 三、用于小目标检测的transformer 3.1 Object Representation 3.2 Fast Attention for High-Resolution or Multi-Scale Feature Maps 3.3 Fully Transformer-Based Detectors 3.4 Architecture and Block Modifications 3.6 Improved …

【打工日常】使用docker部署StackEdit编辑器-Markdown之利器

一、StackEdit介绍 StackEdit一款强大的在线Markdown编辑器,不仅具备卓越的写作功能,还支持实时预览、多设备同步等特性。 很多时候基于安全和信息保密的关系,建议放在自己的服务器或者本地linux去运行,这样会比较省心。 二、本次…

云快充1.5-帧类型码数据定义

1、 注册心跳帧类型码数据定义 1.1 充电桩登录认证 1.2 登录认证应答 1.3 充电桩心跳包 1.4 心跳包应答 1.5 计费模型验证请求 1.6 计费模型验证请求应答 1.7 充电桩计费模型请求 1.8 计费模型请求应答 2、 实时数据帧类型码数据定义 2.1 读取实时监测数据 2.2 上传实…

【AIGC】开源声音克隆GPT-SoVITS

GPT-SoVITS 是由 RVC 创始人 RVC-Boss 与 AI 声音转换技术专家 Rcell 共同开发的一款跨语言 TTS 克隆项目,被誉为“最强大中文声音克隆项目” 相比以往的声音克隆项目,GPT-SoVITS 对硬件配置的要求相对较低,一般只需 6GB 显存以上的 GPU 即可…

冷链物流追踪:Java与MySQL的协同实践

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

打造智能物品租赁平台:Java与SpringBoot的实践

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

工业网关的功能和优势,以及如何选择合适的工业网关-天拓四方

工业网关是连接各种工业设备和系统的通信设备,可以实现不同设备和系统之间的数据交换和通信。它可以作为一个中心节点,将各种工业设备连接起来,形成一个统一的通信网络,从而实现设备的远程监控、数据采集、分析和控制等功能。在工…

【web安全】渗透测试实战思路

步骤一:选目标 1. 不建议太小的公司(可能都是请别人来开发的,用现成成熟的框架) 2. 不建议一线大厂:腾讯,字节,阿里等,你懂的 3. 不建议政府部门,安全设备多&#xff…

c++ 到底是什么呢。需要学的太多了!

如谷歌,苹果,微软,造硬件的更是如此,如amd的,英传达,英特尔,他们都有C加速库。 C难就难在你如果达到顶峰,像些公司一样,是非常难的。因为这些公司已经垄断了市场。 C编译…