Python 中的 typing 模块常见用法

news2024/9/20 10:29:59

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.coloradmin.cn/o/2148668.html

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

相关文章

TMStarget学习——Functional Connectivity

今天基于结构像和功能像数据试验操作TMStarget 的第二个功能模块Functional Connectivity。参考季老师的文档PPT来学习的,整个处理过程蛮长的,可能配置原因一路上报错也比较多,下面还是逐步记录吧,后面采用连更的方式直到跑通后再…

C++ 中的继承(详细讲解)

一、继承的概念以及定义 1、继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保 持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象 程序设计的…

微波无源器件 功分器 4 一种用于天线阵列的紧凑宽带四路双极化波导功分器

摘要: 一种新型紧凑和高效率,在一个同相2x4方案(四路)显示双极化的功分器的设计和仿真被提出了,两个基本的正交模式TE10和TE01在四个方波导处同相输出通过使用四个3端口个四个E面和两个H面功分结构。此功分末端接了两个商用波导(WR75)端口&am…

青柠视频云——如何开启HTTPS服务?

前言 由于青柠视频云的语音对讲会使用到HTTPS服务,这里我们说一下如何申请证书以及如何在实战中部署并且配置使用。 一、证书申请 1、进入控制台 我们拿阿里云的免费个人证书为例,首先登录阿里云,在控制台找到数字证书管理服务,进…

膨胀罐选型计算和其他事项

膨胀罐,也称定压罐、气压罐,广泛应用于空调、太阳能、锅炉等暖通系统以及供水和消防设备,缓冲系统压力波动,消除水锤,起到稳压卸荷的作用。在空调、太阳能、锅炉、地暖等闭式循环系统中,膨胀罐的作用是在工…

3.数据类型

作业系统链接 Python 是一门面向对象友好的语言,支持多种内置数据类型,包括整数(int)、浮点数(float)、布尔值(bool)、字符串(str)、列表(list&am…

直流电表如何在新能源领域进行应用

直流电表在新能源领域的应用广泛且深入,其高精度、实时监测和数据分析能力为新能源系统的运行、管理和优化提供了重要支持。 一、太阳能光伏发电系统 在太阳能光伏发电系统中,直流电表扮演着至关重要的角色。太阳能电池板将光能转化为直流电能&#xf…

.NET 一直跻身 30 大Github最活跃开源项目之列。

大家好,我是编程乐趣。 一直以来都在介绍.Net的热门开源项目,今天来说说.Net本身。 .Net在GitHub上也是一个开源项目,.NET 是一个由 Microsoft 和 .NET 社区共同维护的开源跨平台框架。 自 2017 年以来,.NET 一直是 GitHub 上最…

新手教学系列——非正常关机导致MySQL权限表(db)损坏及修复详解

在使用MySQL的过程中,我们常常会遇到一些问题,尤其是当服务器或主机非正常关机或重启时,MySQL的某些表,特别是权限表(如 mysql.db 表),可能会损坏,导致数据库无法启动或访问。这种情况对生产环境的数据库系统来说是相当严重的,因此掌握修复方法非常重要。 本篇文章将…

分享两个ADG监控脚本

分享两个监控脚本,用于监控Oracle ADG的状态,如果状态异常则发送邮件告警 脚本一: 利用语句查询日志的应用状态,如果长时间未应用则邮件告警,提醒DBA检查ADG的状态是否异常; 阈值条件:最近一…

关于用matplotlib.pyplot加载图片颜色不对的解决方法

1.原理:用opencv加载的图片是BGR存储的。而用matplotlib.pyplot 需要RGB的格式,故在加载之前使用下面的语句改成RGB格式。 img2 cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 或使用 # img2 img[:, :, ::-1]#将图像img的颜色通道进行反转。 ::-1 表示在最后一个维度…

财富通公司开发维修售后小程序,解决售后维修问题

财富通公司为广大用户开发的维修售后小程序,旨在便捷地解决售后维修问题,提升用户体验,增强客户粘性。以下是该小程序如何具体解决售后维修问题的几个关键点: 一. 一站式报修流程 1.简化操作:用户只需通过小程序几步…

智能监控-智能管理系统解决方案

一、引言 在数字化浪潮席卷全球的今天,智能化管理已成为各行业不可或缺的一部分。物联网智能监控管理系统解决方案,凭借其强大的功能性和易用性,为网络传输、环境监测及安全控制提供了全面的智能管理手段。该系统集成了I/O网络模块、高精度传…

HTML/CSS/JS学习笔记 Day7(CSS--C4 CSS的三大特性)

跟着该视频学习,记录笔记:【黑马程序员pink老师前端入门教程,零基础必看的h5(html5)css3移动端前端视频教程】https://www.bilibili.com/video/BV14J4114768?p12&vd_source04ee94ad3f2168d7d5252c857a2bf358 Day6 内容梳理:…

用Python实现时间序列模型实战——Day 26-27: 时间序列分析项目实战

一、学习内容 在本次项目实战中,我们将使用一个复杂的时间序列数据集,展示完整的时间序列分析流程,包括: 数据探索与预处理:初步分析数据的特征,处理缺失值和异常值,进行必要的转换。建模&…

EmguCV学习笔记 VB.Net 12.2 WeChatQRCode

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

BGP 路由反射器

转载:BGP 路由反射器 / 实验介绍: / 原理概述 缺省情况下,路由器从它的一个 IBGP 对等体那里接收到的路由条目不会被该路由器再传递给其他IBGP对等体,这个原则称为BGP水平分割 原则,该原则的根本作用是防止 AS 内部的 BGP 路由…

卷王阿里又开启价格战,大模型价格降价85%!

我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 9月19日,就是昨天,一年一度的云计算盛…

【每天学点AI】一个例子带你了解Python装饰器到底在干嘛!

今天我们来聊聊一种能给你的代码变得“加料”的神器——Python装饰器。 就像一杯咖啡,原本它是苦的,为了让它符合我的口味,我给它添加了糖,添加之后就完美的符合了我的口味。 那么,装饰器又是如何给代码进行“加料”呢…

1 elasticsearch安装

【0】官网参考 https://www.elastic.co/guide/en/elasticsearch/reference/7.11/targz.html 【1】Centos7 下载安装 【1.1】下载 官网:Download Elasticsearch | Elastic 选择好自己想要的相关版本即可; 【2】Centos7.X 前置环境配置(uli…