Python学习之-typing详解

前言:

Python的typing模块自Python 3.5开始引入,提供了类型系统的扩展,能够帮助程序员定义变量、函数的参数和返回值类型等。这使得代码更易于理解和检查,也方便了IDE和一些工具进行类型检查,提升了代码的质量。

typing 模块概述

typing 模块是 Python 标准库中用于支持类型提示的模块。它提供了一系列的类型和类型相关的工具,帮助开发者在代码中添加类型提示,以提高代码的可读性和可靠性。

1 类型提示的基本使用

1.1 变量类型注解:

age: int = 25
name: str = "Alice"

1.2函数参数和返回值类型注解:

def greet(name: str) -> str:
    return "Hello, " + name

1.3列表、字典等复杂类型注解:

from typing import List, Dict

numbers: List[int] = [1, 2, 3]
user_info: Dict[str, str] = {"name": "Alice", "age": "25"}

2 常见的typing模块类型

List[T],Set[T],Dict[K, V]等:用于注解容器类型,T、K、V分别代表容器内元素类型,字典的键和值类型。

2.1 Tuple[T, …]:用于定长元组。

from typing import Tuple

coordinate: Tuple[int, int, int] = (10, 20, 30)

2.2 Optional[T]:用于表示某个类型或None。

from typing import Optional

def get_age(name: str) -> Optional[int]:
    if name == "Alice":
        return 25
    return None

2.3 Union[T, U, …]:当一个参数可能是多种类型之一时使用。

from typing import Union

def log_message(message: Union[str, int]) -> None:
    print(message)

2.4 Callable[[Arg1Type, Arg2Type], ReturnType]:用于表示可调用对象(如函数)的类型签名。

from typing import Callable

def add(a: int, b: int) -> int:
    return a + b

calculator: Callable[[int, int], int] = add

3 Type Hints的高级应用

3.1 泛型:在定义类或函数时,允许使用类型参数。

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/17
# @Author  : Summer
# @File    :
# @describe:
"""
from typing import TypeVar, Generic, List

T = TypeVar('T')


class Stack(Generic[T]):
    def __init__(self) -> None:
        self._container: List[T] = []

    def push(self, item: T) -> None:
        self._container.append(item)

    def pop(self) -> T:
        return self._container.pop()


stack = Stack[int]()
stack.push(1)
print(stack.pop())  # 输出1

上述代码的解析:首先从typing模块导入TypeVar、Generic和List。这些是实现自定义泛型类型的核心组件。
T = TypeVar(‘T’):使用TypeVar创建一个类型变量T。这个变量将用于表示Stack类可以接受的元素的类型。TypeVar是定义泛型类和函数时的占位符,表示可以是任意类型。
class Stack(Generic[T]):定义了一个名为Stack的类,这个类是泛型的,可以存储类型为T的元素。这里的T是在之前用TypeVar定义的类型变量。Generic[T]表示Stack是一个泛型类,它的行为可以基于不同的类型T进行参数化。
在__init__方法中,初始化了一个名为_container的列表,这个列表是用于存储栈中元素的容器。List[T]表示_container是一个列表,其中可以存储任意类型为T的元素。
stack = Stackint创建了一个Stack的实例stack,指定T为int类型。这意味着这个stack实例是一个整型的栈,只能存储整数。
通过push方法向栈中压入一个整数1。
通过pop方法从栈中弹出最后一个元素,也就是之前压入的整数1。
这段代码展示了如何使用Python的typing模块创建泛型数据结构,使得这个数据结构变得更加通用和灵活。它可以在保持类型安全的同时,被用于存储任何指定类型的数据。

3.2 NewType:

用于定义新类型,以帮助区分具有相同基础类型但应用场景不同的场合。

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/17
# @Author  : Summer
# @File    :
# @describe:
"""
from typing import NewType

UserId = NewType('UserId', int)


def get_user_name(user_id: UserId) -> str:
    return "User#" + str(user_id)

user_id = UserId(524313)
print(get_user_name(user_id))  # User#524313

user_id = UserId(524313):使用UserId类型创建一个新的用户ID实例。注意,尽管UserId是基于int的一个新类型,但是这一步看起来和直接对整数进行类型转换(如int(x))相似。然而,UserId(524313)在类型检查时被视为一个与int不同的独立类型。
print(get_user_name(user_id))调用get_user_name函数,并传入之前创建的user_id。然后打印函数的返回值,预期输出为"User#524313"。

4 类型检查工具

typing 模块还提供了一些用于类型检查的工具,如 isinstance()、issubclass() 等。

from typing import List


def is_valid_input(data: List) -> bool:
    return isinstance(data, List)


print(is_valid_input(data=1))  # False
print(is_valid_input(data=[1, 2, 3]))  # True

5 结构化类型和协议

Python 的 typing 模块还支持结构化类型和协议,用于表示对象的形状或接口。可以使用 Protocol 类来定义一个协议,并在参数类型注解中使用。
举个例子,如果我们想定义一个Writable的协议,所有满足这个协议的对象都应该有一个write方法。这里是如何使用Protocol来做这件事的:

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/17
# @Author  : Summer
# @File    :
# @describe:
"""
from typing import Protocol

class Writable(Protocol):
    def write(self, data: str) -> int:
        ...

# 实现了 Writable 接口的类
class FileWriter:
    def write(self, data: str) -> int:
        print(f"Writing {data} to file.")
        return len(data)  # 假设返回写入的字节数

# 实现了 Writable 接口的类
class StringWriter:
    def write(self, data: str) -> int:
        print(f"Writing {data} to string buffer.")
        return len(data)  # 假设返回写入的字节数


# 函数接受任何实现了Writable接口的对象
def write_data(writer: Writable, data: str):
    num_bytes_written = writer.write(data)
    print(f"Wrote {num_bytes_written} bytes.")
    return

# FileWriter和StringWriter没有从Writable显式继承,但它们实现了Writable协议
file_writer = FileWriter()
string_writer = StringWriter()

# 可以传递给write_data函数,因为它们符合Writable协议
write_data(file_writer, "Hello, World!")
write_data(string_writer, "Hello, Python!")

Writable(Protocol)定义了一个需要有write方法的协议,该方法接受一个字符串data并返回一个整数。
类FileWriter和StringWriter都有一个write方法,这意味着它们“符合”Writable协议。注意,我们没有明确地让FileWriter或StringWriter类继承Writable协议。
函数write_data接受Writable类型的参数writer。这意味着任何实现了write方法的对象都可以传递给这个函数。
最后,创建了FileWriter和StringWriter的实例,然后将它们传递给write_data函数,展示了如何在不使用继承的情况下通过协议来实现接口兼容性。
这种方式的好处是可以让你的代码更加灵活,并且它鼓励更好的分离关注点。另外,由于它基于鸭子类型,所以它对于一些动态编程模式也非常有用,例如在mocking或依赖注入中。

小结:

Python的typing模块为静态类型检查提供了强大的支持,通过在代码中添加类型注解,不仅可以提高代码的可读性,还可以利用静态类型检查工具(如mypy)来发现潜在的错误。随着Python生态的发展,类型提示已经成为Python编程的一个重要部分。
如果你觉得文章还不错,请大家 点赞、分享、留言 ,因为这将是我持续输出更多优质文章的最强动力!当然如果有小伙伴需要python、java、性能等等相关的学习资料的也可以私聊我获取哈,都是本人之前收集的一些学习资料,都可以免费提供给大家学习,希望能对大家有帮助。
在这里插入图片描述

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

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

相关文章

Unity之OpenXR+XR Interaction Toolkit快速监听手柄任意按键事件

前言 当我们开发一个VR时,有时希望监听一个手柄按键的点击事件,或者一个按钮的Value值等。但是每次有可能监听的按钮有不一样,有可能监听的值不一样,那么每次这么折腾,有点累了,难道就没有一个万能的方法,让我可以直接监听我想要的某个按钮的事件么? 答案是肯定的,今…

【结构型模式】代理模式

一、代理模式概述 代理模式的定义-意图:给某一个对象提供一个代理或占位符,并由代理对象来控制来原对象的访问(对象结构型模式)。某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动。 代理模式分析: 1.引入一个新的代…

Flutter 之 HTTP3/QUIC 和 Cronet 你了解过吗?

虽然 HTTP3/QUIC 和 cronet 跟 Flutter 没太大关系,只是最近在整理 Flutter 相关资料时发现还挺多人不了解,就放到一起聊聊。 本篇也是主要将现有资料做一些简化整合理解。 前言 其实为什么会有 HTTP3/QUIC ?核心原因还是现有协议已经无法满…

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU+外部etcd使用containerd部署K8S 1.26.15容器版集群(一主多从)》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本,出现了一个问题,就是在pod中访问百度网站,大…

《2024最新Java面试题及答案(带完整目录)》

获取链接:《2024最新Java面试题及答案(带完整目录)》 更多技术书籍:技术书籍分享,前端、后端、大数据、AI、人工智能... ​ ​ ​ 4.1.9.8. 可重入锁(递归锁) ...........................…

十大开源机器人 智能体

1- Poppy 网址 https://www.poppy-project.org/en/ 2- Nao 网址:https://www.aldebaran.com/en/nao 3- iCub 网址: https://icub.iit.it/

vscode 配置go环境

https://www.zhihu.com/question/486786946/answer/2723663432 注意一定要安装最新版,否则不容易debug //main.go package main //说明hello.go这个文件在main这个包中import "fmt" //导入内置包,可以使用其中函数等func main() {fmt.Println("Hello…

机器视觉系统:电容表面瑕疵缺陷检测的精准“守望者”

在电子行业中,电容器作为关键元件,其质量和性能对于整个产品的稳定性和可靠性至关重要。电容器的表面质量直接影响其性能和寿命,因此,对电容表面瑕疵缺陷的精确检测显得尤为重要。近年来,随着机器视觉技术的飞速发展&a…

Linux设置真实IP

1.查看ens33网卡信息 vi /etc/sysconfig/network-scripts/ifcfg-ens33 #添加以下内容 BOOTPROTODHCP #协议类型 dhcp bootp none ONBOOTyes #启动时是否激活 yes | no#修改文件完成后,重启网络 service network restartping www.baidu.com #验证网络是否生效 ifco…

[卷积神经网络]YoloV8

一、YoloV8 1.网络详解 ①backbone部分:第一次卷积的卷积核缩小(由3变为6);CSP模块的预处理卷积从3次变为2次;借鉴了YoloV7的多分支堆叠结构(Multi_Concat_Block)。 所小第一次卷积的卷积核尺寸会损失部分感受野&#…

鸢尾花数据集分类(决策树,朴素贝叶斯,人工神经网络)

目录 一、决策树 二、朴素贝叶斯 三、人工神经网络 四、利用三种方法进行鸢尾花数据集分类 一、决策树 决策树是一种常用的机器学习算法,用于分类和回归任务。它是一种树形结构,其中每个内部节点表示一个特征或属性,每个分支代表这个特征…

特步赞助可能“惹乱子”,北京半马进入官方调查阶段

北京半马风波的发酵超乎想象,从4月14日事件发生到现在,舆论已经从对赛事本身的质疑,上升到一些其他的层面。 从最新的信息来看,北京体育局、北京半马组委会表态称事情还在调查,舆论则大多倾向于“特步幕后操盘、外籍选…

抖去推短视频矩阵系统----源头开发

为什么一直说让企业去做短视频矩阵?而好处就是有更多的流量入口,不同平台或账号之间可以进行资源互换,最终目的就是获客留咨,提单转化。你去看一些做得大的账号,你会发现他们在许多大的平台上,都有自己的账…

Ubuntu 20.04 LTS 在3588安卓主板上测试yolov8-1.0版本的yolov8n-seg模型

0. 创建虚拟环境 #!< 创建虚拟环境yolov8 $ sudo pip install virtualenv $ sudo pip install virtualenvwrapper $ mkvirtualenv yolov8 -p /usr/bin/python3.81. 将yolov8n-seg.pt转换为yolov8n-seg.onnx文件 #!< 创建项目目录yolov8-rknn并下载yolov8n-seg.pt模型文…

MATLAB环境下基于随机期望最大化的多分量信号瞬时频率估计方法

相对于频率成分单一、周期性强的平稳信号来说&#xff0c;具有非平稳、非周期、非可积特性的非平稳信号更普遍地存在于自然界中。调频信号作为非平稳信号的一种&#xff0c;由于其频率时变、距离分辨率高、截获率低等特性&#xff0c;被广泛应用于雷达、地震勘测等领域。调频信…

.net反射(Reflection)

文章目录 一.概念&#xff1a;二.反射的作用&#xff1a;三.代码案例&#xff1a;四.运行结果&#xff1a; 一.概念&#xff1a; .NET 反射&#xff08;Reflection&#xff09;是指在运行时动态地检查、访问和修改程序集中的类型、成员和对象的能力。通过反射&#xff0c;你可…

SAP项目任务一览表

根据SAP Activate项目管理方法论的主要精神&#xff0c;浓缩到一些主要的团队和任务。 主要的团队有&#xff1a; 项目管理(办公室)Project Management(office)&#xff1a;项目经理团队&#xff0c;包括项目办公室。负责项目整体运行和监控&#xff0c;项目办公室负责项目的…

【MySQL 安装与配置】Window简单安装MySQL,并配置局域网连接

文章日期&#xff1a;2024.04.17 系统&#xff1a;Window10 || Window11 类型&#xff1a;安装与配置MySQL数据库 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js…

Stm32-hal库串口教程

工程是在上一节的LED的基础上修改的。 串口原理图 串口配置 led参考 CubelMX点灯-CSDN博客https://blog.csdn.net/anlog/article/details/137830323生成工程 编写包含文件 编写重定向代码 编写发送 编译下载 串口没有收到数据 查找原因 少配置了下图 再编译下载 收到数据…

【MySQL 数据宝典】【内存结构】- 002 Page管理机制

一、 Page 管理机制 Buffer Pool 的底层采用链表数据结构管理Page。在InnoDB访问表记录和索引时会在Page页中缓存&#xff0c;以后使用可以减少磁盘IO操作&#xff0c;提升效率。 1.1 Page 页的分类 free page &#xff1a; 空闲page&#xff0c;未被使用clean page&#xff…