【python3】函数注解
Python 函数注解 (Function Annotations)
- Python 函数注解 (Function Annotations)
- 函数注解的基本语法
- 基本语法格式
- 示例
- 特殊类型注解
- 注解信息的存储与访问
- 函数注解的实际用途
- 注意事项
- 小结
函数注解是 Python 的一种特性,用于为函数的参数和返回值添加 元数据。注解通常和类型提示(type hinting)相关联,但它们本质上不会影响程序的实际执行,只是作为一种信息记录。
从Python 3.0开始,函数注解就成为了语言的一部分。在Python 3.5中,加入了类型提示(PEP 484),使得函数注解的使用变得更加规范化和流行。
函数注解的基本语法
函数注解的基本形式是使用冒号 :
来为函数的参数指定类型信息,使用 ->
来为函数的返回值指定类型信息。
基本语法格式
def function_name(param_name: annotation, ...) -> return_annotation:# 函数体pass
- 参数注解:使用
param_name: annotation
的形式为参数进行注解。 - 返回值注解:使用
-> return_annotation
的形式为返回值进行注解。 - 注解通常在函数定义中作为可选的元数据存在,不会对实际的代码逻辑产生影响。
示例
def greet(name: str) -> str:return f"Hello, {name}"def add(x: int, y: int) -> int:return x + ydef process_data(data: list[int]) -> dict[str, int]:# 假设这个函数对输入的数据进行处理并返回一个字典result = {str(index): value for index, value in enumerate(data)}return result
-
greet
函数:- 参数
name
注解为str
,表示这个参数应该是一个字符串。 - 返回值注解为
str
,表示该函数返回一个字符串。
- 参数
-
add
函数:- 参数
x
和y
注解为int
,表示它们应该是整数。 - 返回值注解为
int
,表示返回的结果是一个整数。
- 参数
-
process_data
函数:- 参数
data
注解为list[int]
,表示它是一个包含整数的列表。 - 返回值注解为
dict[str, int]
,表示它返回一个键为字符串、值为整数的字典。
- 参数
特殊类型注解
Python通过 typing
模块提供了一些用于类型注解的工具,以帮助描述更加复杂的数据结构。这些注解工具使得我们可以对更加复杂的类型关系进行描述,例如列表、字典、元组、联合类型等。
以下是一些常见的 typing
模块的类型:
List
:用来注解列表,例如List[int]
表示一个包含整数的列表。Dict
:用来注解字典,例如Dict[str, int]
表示键是字符串、值是整数的字典。Tuple
:用来注解元组,例如Tuple[int, str]
表示包含一个整数和一个字符串的元组。Optional
:用来注解可选值,即参数可能为指定类型或None
,例如Optional[str]
。Union
:用来注解参数可以是多种类型之一,例如Union[int, str]
表示参数可以是整数或字符串。
例如:
from typing import List, Dict, Tuple, Optional, Uniondef get_user_data(user_id: int) -> Optional[Dict[str, Union[str, int]]]:if user_id == 1:return {"name": "Alice", "age": 30}else:return Nonedef get_coordinates() -> Tuple[float, float]:return (37.7749, -122.4194)
get_user_data
函数返回一个Optional
的字典,这个字典的键是字符串,值是字符串或整数,或者它可能返回None
。get_coordinates
函数返回一个元组,包含两个浮点数。
注解信息的存储与访问
函数注解信息存储在函数对象的 __annotations__
属性中。你可以通过访问这个属性来查看注解信息。
例如:
def multiply(a: int, b: int) -> int:return a * bprint(multiply.__annotations__)
输出:
{'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}
这里的输出表明 multiply
函数的参数 a
和 b
以及返回值都有类型注解为 int
。
函数注解的实际用途
-
代码文档化:
注解可以使代码更加自文档化,程序员可以一目了然地了解函数期望的输入类型和输出类型,而不必阅读完整的函数实现。 -
静态类型检查:
使用工具如mypy
,可以通过静态类型检查来发现一些潜在的类型错误。例如,mypy
可以在开发阶段验证函数的使用是否遵循注解要求,有助于提高代码质量。 -
IDE支持:
现代化的集成开发环境(如 PyCharm, VSCode)可以基于注解提供更好的自动补全、类型推断和错误提示,使得开发者在编写代码时更容易避免错误。
注意事项
-
类型注解并不是强制性的:Python 的注解只是对数据类型的提示,并不强制类型检查,因此即使参数类型与注解不符,Python 也不会报错。
-
避免复杂的注解:有时,过于复杂的类型注解会使得代码难以阅读。此时可以使用
Any
来简化类型注解。 -
结合类型检查工具:为了最大化函数注解的效用,可以结合工具如
mypy
进行静态检查。这些工具可以帮助你在代码运行前发现类型不匹配的错误。
小结
- 函数注解 是一种为函数的参数和返回值提供元数据的机制。
- 注解可以显著提升代码的可读性和可维护性。
- 函数注解的语法使用冒号
:
和箭头->
来分别注解参数和返回值类型。 - Python 内置的
typing
模块可以用来表示更复杂的数据结构。 - 注解只提供信息,并不会改变Python的运行机制。
相关文章:
【python3】函数注解
Python 函数注解 (Function Annotations) Python 函数注解 (Function Annotations)函数注解的基本语法基本语法格式示例 特殊类型注解注解信息的存储与访问函数注解的实际用途注意事项小结 函数注解是 Python 的一种特性,用于为函数的参数和返回值添加 元数据。注解…...
leetcode hot100 之【LeetCode 42. 接雨水】 java实现
LeetCode 42. 接雨水 题目描述 给定一个非负整数数组 height 表示柱状图中每个柱子的高度,请你计算按此排列的柱状图能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面的柱状图可以…...
10月18日,每日信息差
第一、现代汽车集团在上海举办了中国前瞻技术研发中心的发布及启新庆典,宣布成立其全资法人公司 —— 现代前瞻汽车技术开发(上海)有限公司。该中心是集团在海外建立的首个前瞻技术研发中心,专注于自动驾驶、智能座舱、共享出行等…...

Axure科技感元件:打造可视化大屏设计的得力助手
Axure,作为一款专业的原型设计工具,凭借其强大的设计功能、丰富的组件库和灵活的交互能力,成为了许多设计师打造科技感设计的首选工具。其中,Axure科技感元件更是以其独特的魅力和实用性,在数据可视化大屏、登录界面、…...
【模板】最近公共祖先(LCA)倍增
P3379 P3379 【模板】最近公共祖先(LCA) # 【模板】最近公共祖先(LCA) ## 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。 ## 输入格式 第一行包含三个正整数 $N,M,S$&#…...

我的JAVA项目构建
1.Maven maven就是pip 设置maven下载的的jar包位置 换源 下载插件maven-search 配置dependency 2.Tomcat 设置环境变量JAVA_HOME 设置编码方式 方框就是路径的前缀 3.Servlet 新建项目 写一个类继承HttpServlet,复写doGet(应对Get请求),doPost(应对…...

应用层协议 序列化
自定义应用层协议 例子:网络版本计算器 序列化反序列化 序列化:将消息,昵称,日期整合成消息-昵称-日期 反序列化:消息-昵称-日期->消息,昵称,日期 在序列化中,定义一个结构体…...

【HAD】Half-Truth: A Partially Fake Audio Detection Dataset
文章目录 Half-Truth: A Partially Fake Audio Detection Dataset背景key points研究数据集设计评价指标实验基线:utterance-level分类(话语级)基线:segment-level分类(片段级)Half-Truth: A Partially Fake Audio Detection Dataset 会议/期刊:Interspeech 2021 CCF-C…...
OpenAI Prompt generation - 生成和优化Prompt的Prompt
OpenAI Prompt generation - 生成和优化Prompt的Prompt 从头开始创建 Prompt 可能很耗时,所以快速生成 Prompt 可以帮助我们提高效率。 下面是 OpenAI 提供的协助生成 Prompt 的 Prompt。 from openai import OpenAIclient OpenAI()META_PROMPT ""&qu…...
Android技术探索:深入解析Android组件
Android系统以其开放性和多样性,成为了众多开发者的首选平台。在Android应用的开发中,组件(Components)是构建应用的基础元素。深入了解Android组件,对于开发者来说至关重要。本文将详细探讨Android的四大核心组件&…...
使用R-GCN处理异质图ACM的demo
加载和处理数据集 import torch from torch_geometric.datasets import HGBDataset from torch_geometric.transforms import RandomLinkSplit# 加载ACM数据集,这是一个包含论文(paper)、主题(subject)以及它们之间关…...

征程 6E DISPLAY 功能介绍及上手实践
01 功能概述 本文将带大家一起实现单路、多路 MIPI CSI TX 输出、IDU 回写、IDU oneshot 模式、绑定输出 VPS 数据等功能,此处主要介绍各 sample 的实现与使用方法。 02 软件架构说明 本文中绑定 VPS 输出功能基于 libvio API 实现,调用 libvio 提供的…...

安卓窗口wms/input小知识NO_INPUT_CHANNEL剖析
背景: 经常在学员的vip技术群里经常有很多学员会提问一些不太常见的窗口和input的相关的问题,虽然不太常见,但确实是工作中会遇到的一些问题,所以马哥有必要进行一下记录这些窗口技术知识点。 具体分享技术点: input中…...

【2024最新版】Win10下 Java环境变量配置----适合入门小白
首先,你应该已经安装了 Java 的 JDK 了(如果没有安装JDK,请跳转到此网址:http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html) 笔者安装的是 jdk-8u91-windows-x64 接下来主要讲怎么配…...
Servlet 生命周期详解及案例演示(SpringMVC底层实现)
文章目录 什么是Servlet?Servlet生命周期简介1. 初始化阶段:init()方法示例代码: 2. 请求处理阶段:service() 和 doGet()、doPost()方法示例代码: 3. 销毁阶段:destroy()方法示例代码: Servlet生…...

2024 kali系统2024版本,可视化界面汉化教程(需要命令行更改),英文版切换为中文版,基于Debian创建的kali虚拟机
我的界面如下所示 1. 安装 locales sudo apt install locales 2. 生成中文语言环境 sudo locale-gen zh_CN.UTF-8 如果你希望安装繁体中文,可以加入: sudo locale-gen zh_TW.UTF-8 3. 修改 /etc/default/locale 文件 确保有以下内容 LANGzh_CN.UT…...
深入理解 CMake 中的 INCLUDE_DIRECTORIES 与 target_include_directories
在使用 CMake 构建系统时,指定头文件的包含路径是非常常见的一步。对于这个任务,CMake 提供了两种主要的命令:INCLUDE_DIRECTORIES 和 target_include_directories。虽然它们看似类似,但它们的作用范围、应用方式以及适用场景却有…...
【不知道原因的问题】java.lang.AbstractMethodError
项目场景: 提示:这里简述项目相关背景: 遇到了一个问题: java.lang.AbstractMethodError 问题描述 提示:这里描述项目中遇到的问题: 在Java开发中,java.lang.AbstractMethodError是一个常见…...

分布式篇(分布式事务)(持续更新迭代)
一、事务 1. 什么是事务 2. 事务目的 3. 事务的流程 4. 事务四大特性 原子性(Atomicity) 一致性(Consistency) 持久性(Durability) 隔离性(Isolation) 5. MySQL VS Oracle …...

[Linux] 逐层深入理解文件系统 (2)—— 文件重定向
标题:[Linux] 逐层深入理解文件系统 (2)—— 文件重定向 个人主页水墨不写bug (图片来源于网络) 目录 一、文件的读取和写入 二、文件重定向的本质 1.手动模拟重定向的过程——把标准输出重定向到redir.txt 2.重定向…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...