Python3-类型标注支持

2023-11-06

typing为Python的一个标注库,此默认支持PEP 484PEP 526指定的类型提示。最基本的支持由AnyUnionTupleCallableTypeVarGeneric类型组成。有关完整的规范,请参阅PEP 484,有关任何类型提示的简单介绍,请参阅PEP 483

举个栗子,函数接收并返回一个字符串,如下所示:

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

在函数func中,参数预期是str类型,并且返回str类型

typing模块的作用:

  • 类型检查,防止运行时出现参数和返回值类型不符合
  • 作为开发文档附加说明,方便使用者调用传入和返回类型
  • 该模块加入之后并不会影响程序的运行,不会报正式的错误,只有提醒

类型别名

类型别名通过将类型分配别名来进行定义,在这个例子中,VectorList[str]可以视为可互换的同义词:

from typing import List
Vector = List[str]

def func(name: str) -> Vector:
    return [name]

print(Vector, type(Vector))         # typing.List[str] <class 'typing.GenericMeta'>
value = func("laozhang")
print(value, type(value))           # ['laozhang'] <class 'list'>

NewType

使用NewType()辅助函数来创建不同的类型

from typing import NewType

UserId = NewType("UserId", int)
UserName = NewType("UserName", str)

静态类型检查器会将新类型视为它最原始类型的子类,这对于捕捉逻辑错误非常有用:

def from_int_to_str(user_id: UserId) -> str:
    return str(user_id)
    
print(from_int_to_str(UserId(123)))     # 123
print(from_int_to_str(123))             # 123

你仍然可以对UserId类型的变量执行所有的int支持的操作,但结果将始终为int类型,如下:

value = UserId(123) + UserId(456)
print(value)            # 579
print(type(value))      # <class 'int'>

值得注意的是,UserId = NewType("UserId", int)UserId是一个函数,该函数将会立即返回你传递给它的任何参数。这也意味着,无法创建UserId的子类型,因为它是运行时的标识函数,而不是实际类型,下面这种写法是错误的:

class MyUser(UserId):
    pass

但是,可以基于UserId创建NewType,如下:

ChildUserId = NewType("ChildUserId", UserId)

Callable

期望特定签名的回调函数可以将类型标注为Callable[[Arg1Type, Arg2Type], ReturnType]。例如:

from typing import Callable

def finder(on_success: Callable[[str, int], None]) -> None:
    pass
    

def on_success(s: str, i: int) -> None:
    pass

finder(on_success=on_success)

如果传递过去的回调函数中的参数或返回类型不匹配,PyCharm将会有警告提示

泛型(Generics)

泛型可以使用typing模块中名为TypeVar的新工厂进行参数化,如下:

from typing import TypeVar

T = TypeVar("T")

def finder(s: T) -> T:
    return s

泛型类型可以有任意数量的类型变量,这样的话类型变量可能会收到限制:

from typing import TypeVar

T = TypeVar("T", int, str)

def finder(s: T) -> T:
    return s

这样的话,finder函数将只能接收int/str类型的参数,否则将会有警告提示

typing模块常用类型

  • int,、float: 整形、浮点型
  • bool、str: 布尔型、字符串类型
  • List、Dict、Tuple、Set: 列表、字典、元组、集合
  • Iterable、Iterator: 可迭代类型、迭代器类型
  • Generator: 生成器类型

更多关于typing模块的使用:https://docs.python.org/zh-cn/3.7/library/typing.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python3-类型标注支持 的相关文章

随机推荐

  • 如何在 Ubuntu 22.04 上安装和保护 Grafana

    介绍 Grafana是一种开源数据可视化和监控工具 可与来自以下来源的复杂数据集成普罗米修斯 InfluxDB Graphite and 弹性搜索 Grafana 允许您为数据创建警报 通知和临时过滤器 同时还可以通过内置共享功能更轻松地与
  • 如何在 Ubuntu 12.10 上使用 Nginx 设置 HTTP 身份验证

    什么是Red Means 用户需要输入或自定义的行将位于red在本教程中 其余的大部分应该是可复制和粘贴的 关于 Nginx Nginx 发音为 engine x 是一个 HTTP 和反向代理服务器 以及邮件代理服务器 由 Igor Sys
  • 如何在零停机的情况下将 WordPress 从共享主机迁移到云服务器

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • 如何在 Ubuntu 22.04 上使用 apt 安装 Java

    介绍 许多软件都需要 Java 和 JVM Java 虚拟机 包括Tomcat Jetty 玻璃鱼 卡桑德拉 and Jenkins 在本指南中 您将使用以下命令安装各种版本的 Java 运行时环境 JRE 和 Java 开发人员工具包 J
  • 如何在 Ubuntu 16.04 上使用 GitLab CI 设置持续集成管道

    介绍 GitLab 社区版是一个自托管的 Git 存储库提供商 具有帮助项目管理和软件开发的附加功能 GitLab 提供的最有价值的功能之一是内置的持续集成和交付工具 称为亚搏体育appGitLab持续集成 在本指南中 我们将演示如何设置
  • Linux 中的导出命令

    在本指南中 我们将了解 Linux 中的导出命令 Export 是 Bash shell 的内置命令 它用于标记要传递给子进程的变量和函数 基本上 变量将包含在子进程环境中 而不会影响其他环境 为了更清楚地了解我们正在讨论的内容 让我们深入
  • 如何在 Ubuntu 20.04 上安装 Node.js

    介绍 Node js是用于服务器端编程的 JavaScript 运行时 它允许开发人员使用 JavaScript 创建可扩展的后端功能 这是许多人在基于浏览器的 Web 开发中已经熟悉的语言 在本指南中 我们将向您展示在 Ubuntu 20
  • 如何在 Ubuntu 13.10 上安装 Hadoop

    先决条件 本教程的唯一先决条件是 VPS乌班图 13 10 x64安装 您需要从命令行执行命令 可以通过以下两种方式之一执行 使用 SSH 访问 Droplet 使用 Digital Ocean Droplet 管理面板中的 控制台访问 什
  • 如何在 CentOS 7 上将 MySQL 数据目录更改到新位置

    介绍 数据库随着时间的推移而增长 有时会超出文件系统上的空间 当它们与操作系统的其余部分位于同一分区时 您也可能会遇到 I O 争用 RAID 网络块存储和其他设备可以提供冗余和其他所需的功能 无论您是要添加更多空间 评估优化性能的方法 还
  • 如何设置 MySQL 主主复制

    Status 已弃用 本教程已被弃用并且不再维护 Reason 本教程介绍了构建多主拓扑的过时方法 在本文最初发表时 MySQL 中尚未实现组复制 请参阅 您可以阅读最新的如何在 Ubuntu 16 04 上配置 MySQL 组复制设置多主
  • 如何在 CentOS 7 上使用 Barman 备份、恢复和迁移 PostgreSQL 数据库

    介绍 PostgreSQL是一个开源数据库平台 因其易于维护 成本效益以及与其他开源技术的简单集成而深受 Web 和移动应用程序开发人员的欢迎 维护 PostgreSQL 环境的一项关键任务是定期备份其数据库 备份是任何组织灾难恢复 DR
  • NGINX 作为 Node 或 Angular 应用程序的反向代理

    反向代理是一种从一个或多个上游服务器为客户端检索资源的服务器 它通常将自己置于专用网络中的防火墙后面 并将客户端请求转发到这些上游服务器 反向代理极大地提高了任何 Web 应用程序的安全性 性能和可靠性 许多用 NodeJS 或 Angul
  • js:使用正则将地理位置脱敏。5个字以内,保留第一个字和最后两个字,其余用*替代;6到9个字则保留最后五个字,其余用*替代;10个字以上则最后五个字的前面四个字代替为*

    需求背景 使用正则将地理位置脱敏 5个字以内 保留第一个字和最后两个字 其余用 替代 6到9个字则保留最后五个字 其余用 替代 10个字以上则最后五个字的前面四个字代替为 解决方法 enAdderssFun text if text len
  • 基于servlet+jsp的在线考试管理系统

    1 1 基于servlet jsp的在线考试管理系统 1 2 程序 编程语言 java 前台 jsp 开发工具 IDEA2020 JDK1 8 mysql5 7 tomat 8 管理账号 admin 密码 123456 请求localhos
  • JSX 的基本使用

    1 JSX 简介 通过上一篇博客的 1 个小应用 我们能体会到 和 Vue 相比代 用 React 写一个这么小的应用比较麻烦 而且代码比较混乱 接触过 Vue 的开发者应该知道 Vue 有两个构建版本 如果单独使用非完整版其实和上述用 R
  • Flask在Windows环境下的部署

    背景 由于目前在用的Flask项目涉及到一部分依赖Windows的处理 还无法迁移到linux平台 那么在windows环境下 要怎么部署呢 思路 根据Flask官网介绍 由于Flask内置的服务器性能不佳 推荐的主要的部署方式有如下几种
  • 若依系统(微服务版本)部署流程

    若依系统 微服务版本 部署流程 此处做最基本的部署 后续需要可根据系统需要添加功能 微服务版本源码地址 https gitee com y project RuoYi Cloud 若依系统官网 http www ruoyi vip 系统架构
  • Android Studio Gradle插件版本与Gradle 版本对应关系

    工作中 新接手同事维护老项目 因升级 Android Gradle 插件版本与Gradle 版本不匹配 致使无法构建打包 特此进行了梳理 目录 1 Android Gradle插件版本 与 Gradle版本关系 1 1 修改Gradle插件
  • 疯壳-鸿蒙OS-总线驱动开发及实现之SPI

    总线驱动及实现之SPI 疯壳 出品 SPI接口说明 鸿蒙OS中关于spi接口的定义在源码目录 drivers hdf frameworks include platform drivers hdf frameworks support pl
  • Python3-类型标注支持

    typing为Python的一个标注库 此默认支持PEP 484和PEP 526指定的类型提示 最基本的支持由Any Union Tuple Callable TypeVar和Generic类型组成 有关完整的规范 请参阅PEP 484 有