Python 中的 typing 模块常见用法

typing 模块是 Python 提供的一个标准库,主要用于为函数、变量和类定义类型提示(Type Hints),从而提高代码的可读性和类型安全性。虽然 Python 是动态类型语言,但通过 typing 模块,开发者可以明确指定变量和函数的参数、返回值的类型,帮助 IDE 或静态代码分析工具提供更好的代码提示和错误检查。虽然 Python 本身不会强制执行这些类型检查,但借助 mypy 等工具,可以进行静态类型分析,帮助发现潜在问题。

源码位置:D:\Python310\Lib\typing.py

一.常见类型提示

1.ListDict

用于表示列表和字典类型。

(1)List[type] 表示一个包含特定类型元素的列表。

(2)Dict[key_type, value_type] 表示键和值有特定类型的字典。

2.Tuple

表示一个包含特定类型的元组。Tuple[type1, type2] 表示一个包含两个特定类型的元组。

3.Optional

表示变量可以是某种类型,也可以是 NoneOptional[type] 等价于 Union[type, None],表示某个值可以是 typeNone

4.Union

表示一个变量可以是多个类型之一。Union[type1, type2, ...] 表示变量可以是 type1type2 等中的任意一种。

5.Any

表示可以是任意类型。Any 用于声明一个变量可以是任意类型,不做类型检查。

6.Callable

表示可调用的对象,如函数。Callable[[arg_type1, arg_type2], return_type] 用于表示一个函数,参数类型为 arg_type1arg_type2,返回值类型为 return_type

7.TypeVar

用于定义泛型。TypeVar 用于创建通用函数或类。

8.Literal

限制变量值为某些特定的值。

9.Set

表示一个包含特定类型元素的集合。比如 Set[str] 表示一个字符串集合。

10.FrozenSet

表示一个不可变的集合。比如 FrozenSet[int] 表示一个不可变的整数集合。

11.Generic

用于创建泛型类和泛型接口。比如 class MyList(Generic[T]) 表示一个泛型列表类,可以存储类型 T 的元素。

12.Type

表示一个类型对象。比如 Type[str] 表示 str 类型。

二.常见用法

1.List|Dict|Tuple示例

from typing import List, Dict, Tuple

# 一个返回包含字符串的列表的函数
def get_names() -> List[str]:
    return ["Alice", "Bob", "Charlie"]

# 一个带有字典类型提示的函数
def get_person_data() -> Dict[str, int]:
    return {"Alice": 30, "Bob": 25}

# 一个带有元组类型提示的函数
def get_coordinates() -> Tuple[int, int]:
    return (10, 20)
  • get_names():返回一个 List[str],即一个字符串列表。
  • get_person_data():返回一个 Dict[str, int],表示字典的键是字符串,值是整数。
  • get_coordinates():返回一个 Tuple[int, int],即一个包含两个整数的元组。

2.Optional 示例

from typing import Optional

def find_user(user_id: int) -> Optional[str]:
    if user_id == 1:
        return "Alice"
    return None

find_user():返回类型是 Optional[str],表示可能返回字符串,或者返回 None

3.Union 示例

from typing import Union

def process_input(data: Union[int, str]) -> str:
    if isinstance(data, int):
        return f"Received an integer: {data}"
    return f"Received a string: {data}"

process_input():参数类型是 Union[int, str],表示该函数接收整数或字符串两种类型。

4.Callable 示例

from typing import Callable

# 定义一个函数接收另一个函数作为参数
def execute_task(task: Callable[[int, int], int], a: int, b: int) -> int:
    return task(a, b)

# 示例调用
def add(x: int, y: int) -> int:
    return x + y

result = execute_task(add, 3, 4)  # 返回 7

execute_task():接收一个可调用对象(函数),该对象接收两个整数并返回一个整数。

5.TypeVar 泛型示例

from typing import TypeVar, List

T = TypeVar('T')

def get_first_element(lst: List[T]) -> T:
    return lst[0]

# 使用时可以是不同的类型
print(get_first_element([1, 2, 3]))      # 返回 1
print(get_first_element(['a', 'b', 'c']))  # 返回 'a'

TypeVar:允许定义一个泛型函数 get_first_element,它可以适用于任何类型的列表。

三.高级用法

1.Literal 示例

from typing import Literal

def set_mode(mode: Literal['read', 'write']) -> None:
    if mode == 'read':
        print("Setting mode to read")
    elif mode == 'write':
        print("Setting mode to write")

set_mode('read')   # 合法
set_mode('write')  # 合法
set_mode('delete') # 非法,会被静态分析工具标记为错误

Literal:限制传入的值必须是特定的字面值,在此例中只能是 'read''write'

2.TypedDict示例

from typing import TypedDict

class User(TypedDict):
    name: str
    age: int

def get_user() -> User:
    return {"name": "Alice", "age": 30}

TypedDict:用于定义字典的具体结构,使字典的键和值类型更加明确。

3.Protocol示例

用于定义接口协议,可以检查对象是否实现了特定的方法和属性。

from typing import Protocol

class Drawable(Protocol):
    def draw(self) -> None:
        ...

4.Final 示例

表示一个变量、方法或属性不能被重写或修改。

from typing import Final

MAX_SIZE: Final = 100

5.ClassVar 示例

表示一个类变量,它不应被视为实例变量的一部分。

from typing import ClassVar

class MyClass:
    class_var: ClassVar[int] = 42

6.NoReturn

表示函数不会返回任何值(通常用于函数抛出异常的情况)。

from typing import NoReturn

def terminate() -> NoReturn:
    raise SystemExit

参考文献

[1] typing 对类型提示的支持:https://docs.python.org/zh-cn/3/library/typing.html

[2] https://github.com/python/mypy

[3] https://www.mypy-lang.org/

NLP工程化(星球号)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【2024研赛】【华为杯E题】2024 年研究生数学建模比赛思路、代码、论文助攻

思路将在名片下群聊分享 高速公路应急车道紧急启用模型 高速公路拥堵现象的原因众多,除了交通事故外,最典型的就是部分路段出现瓶颈现象,主要原因是车辆汇聚,而拥堵后又容易蔓延。高速公路一些特定的路段容易形成堵点&#xff0…

Scrapy爬虫实战——某瓣250

# 按照我个人的习惯,在一些需要较多的包作为基础支撑的项目里,习惯使用虚拟环境,因为这样能极大程度的减少出现依赖冲突的问题。依赖冲突就比如A、B、C三个库,A和B同时依赖于C,但是A需要的C库版本大于N,而B…

一文说清楚ETL与Kafka如何实现集成

ETL与Kafka为何需要集成? 随着企业对实时流数据的处理要求越来越高,很多企业都把实时流数(日志、实时CDC采集数据、设备数据…)先推入到kafka中,再通过ETL对kafka中的数据进行消费通过ETL强大的数据的转换、清洗功能来进行数据的集成与分发。 实时数据…

CefSharp_Vue交互(Element UI)_WinFormWeb应用---设置应用透明度(含示例代码)

一、界面预览 1.1 设置透明(整个页面透明80%示例) 限制输入值:10-100(数字太小会不好看见) 1.2 vue标题栏 //注册类与js调用 (async function(

11年计算机考研408-数据结构

设执行了k次。 解析: d要第一个出,那么abc先入栈,d入栈然后再出栈,这前面是一个固定的流程,后面就很灵活了,可以ecba,ceba,cbea,cbae。 答案是4个序列。 解析&#xff1a…

CSS 复合选择器简单学习

目录 1. Emmet 语法 1.1 快速生成 HTML 结构语法 1.2 快速生成 CSS 样式 1.3 格式化工具 2. 调试 2.1 打开调试工具 2.2 使用调试工具 3. 复合选择器 3.1 后代选择器 3.2 子选择器 3.3 并集选择器 3.4 伪类选择器 3.3.1 链接伪类选择器 3.3.2 :focus 伪类选择器 …

OpenCV特征检测(5)检测图像中的角点函数cornerMinEigenVal()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算用于角点检测的梯度矩阵的最小特征值。 该函数类似于 cornerEigenValsAndVecs,但它计算并存储协方差矩阵导数的最小特征值&…

帧率和丢帧分析理论

一、丢帧问题概述 应用丢帧通常指的是在应用程序的界面绘制过程中,由于某些原因导致界面绘制的帧率下降,从而造成界面卡顿、动画不流畅等问题。以60Hz刷新率为例子,想要达到每秒60帧(即60fps)的流畅体验,每…

NLP 主要语言模型分类

文章目录 ngram自回归语言模型TransformerGPTBERT(2018年提出)基于 Transformer 架构的预训练模型特点应用基于 transformer(2017年提出,attention is all you need)堆叠层数与原transformer 的差异bert transformer 层…

1--SpringBoot外卖项目介绍及环境搭建 详解

目录 软件开发整体流程 软件开发流程 角色分工 软件环境 苍穹外卖项目介绍 项目介绍 产品原型 技术选型 开发环境搭建 前端环境搭建 后端环境搭建 完善登录功能 导入接口文档 Swagger 介绍 使用方式 常用注解 软件开发整体流程 软件开发流程 需求分析&#x…

Shiro-721—漏洞分析(CVE-2019-12422)

文章目录 Padding Oracle Attack 原理PKCS5填充怎么爆破攻击 漏洞原理源码分析漏洞复现 本文基于shiro550漏洞基础上分析,建议先看上期内容: https://blog.csdn.net/weixin_60521036/article/details/142373353 Padding Oracle Attack 原理 网上看了很多…

ElasticSearch-2-核心语法集群高可用实战-Week2

ES批量操作 1.批量获取文档数据 这里多个文档是指,批量操作多个文档,搜索查询文档将在之后的章节讲解 批量获取文档数据是通过_mget的API来实现的 (1)在URL中不指定index和type 请求方式:GET 请求地址:_mget 功能说明 &#…

【C++ Primer Plus习题】16.10

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <string> #include <…

java自定义线程池详解

目录 线程池使用线程池的目的线程池工作原理线程池常用方法自定义线程池等待队列拒绝策略线程工厂 线程池 使用线程池的目的 资源复用&#xff0c;降低开销。重复利用已创建的线程&#xff0c;避免线程频繁地创建和销毁带来的性能开销。方便线程的可管理性。线程是稀缺资源&a…

【GVINS】

【GVINS】 1. GVINS的系统特点2. GVINS的融合导航存在问题3. GVINS的信号的组成4. GVINS的信号的组成 原理推导知乎 1. GVINS的系统特点 概述了一种名为GVINS的系统&#xff0c;它旨在解决视觉-惯性里程计&#xff08;VIO&#xff09;在长时间运行时出现的漂移问题。GVINS通过…

三菱变频器Modbus-RTU 通讯规格

能够从变频器的 RS-485 端子使用 Modbus-RTU 通讯协议&#xff0c;进行通讯运行和参数设定。 NOTE: 1、使用 Modbus-RTU 通讯协议时&#xff0c;请设定Pr.549 协议选择 “1” 2、从主机按地址0(站号0)进行hodbus-RTU通讯时&#xff0c;为广播通讯&#xff0c;变频器不向主机发…

软件设计画图,流程图、甘特图、时间轴图、系统架构图、网络拓扑图、E-R图、思维导图

目录 一、流程图 二、甘特图 三、时间轴图 四、系统架构图 五、网络拓扑图 六、E-R图 七、思维导图 一、流程图 是一种用符号表示算法、工作流或流程的图形。用不同的图形表示不同含义&#xff0c;如椭圆表示开始和结束、菱形表示判断等。 画图工具WPS office 应用市场…

idea启动oom了解决

解决 Error:java: java.lang.OutOfMemoryError: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/mingan/pb/backend/src/main/java/com/cy/backend/service/impl/StorageServiceImpl.java]]pos36199: WrappedJavaFileObject[org.jetbrains.jps.j…

松材线虫目标检测数据集,12522张图-纯手工标注

松材线虫目标检测数据集&#xff0c;12522张图像&#xff0c;专家纯手工标注。 松材线虫目标检测数据集 数据集描述 该数据集是一个专门用于松材线虫&#xff08;Bursaphelenchus xylophilus&#xff09;检测的数据集&#xff0c;旨在帮助研究人员和开发者训练和评估基于深度…

地平线4登录xbox后提示需要登录档案怎么解决

这个游戏是真nt&#xff08;在联机上&#xff09;&#xff0c;典型搞联机2小时游玩半小时&#xff0c;多半时间都花费在联机上了&#xff0c;不是为了联机和朋友跑车&#xff0c;早给他卸载了。 本人的游戏问题&#xff1a;看了一些视频感觉没什么作用&#xff0c;我的现象就是…