Python函数 — 类型提示和存根文件
1、类型提示
类型提示(Type Hints)也叫函数标注,函数注解,元数据(元数据是用来描述数据的数据)。 详见 PEP 3107 和 PEP 484
Python中,自定义函数的时候,可以为函数添加一些额外的信息来限制参数类型和返回值类型,方便他人读懂你的代码,这些额外信息就是函数标注。
元数据以字典的形式存放在函数的 __annotations__ 属性中。
Python解释器不会对这些标注添加任何语义,也不会使用标注对传入的变量进行类型检查,标注并且不会影响函数的功能,和没有添加标注的函数完全没有区别。
添加标注:
- 形参标注的定义方式是在形参名后加冒号,后面跟一个表达式,该表达式会被求值为标注的值。
- 返回值标注的定义方式是加组合符号 ->,后面跟一个表达式,该标注位于形参列表和表示 def 语句结束的冒号之间。
(1)给函数添加标注示例如下
def greeting(name: str) -> str:return 'Hello ' + name
说明,这里的name: str 表示参数name的类型为str,-> str 表示函数返回值类型为str。
(2)打印函数的元数据信息
print(greeting.__annotations__)
---------------------------------------------------------------------------------
{'name': <class 'str'>, 'return': <class 'str'>}
(3)调用函数,传入的实参跟函数标注的参数类型一致
print(greeting('tom'),type(greeting('tom')))
---------------------------------------------------------------------------
Hello tom <class 'str'>
(4)调用函数,传入的实参跟函数标注的参数类型不一致
这里是由于pycharm这一类的IDE工具自带了类型静态检查器,在编写代码的时候就给出了错误提示!
2、存根文件
存根文件可以简单的理解为一个函数参数类型的静态类型检查器,在编写代码的时候就给出提示。由于Python本身是动态语言,不像静态语言可以在编译的时候进行类型检查,所以通过存根文件、注解这些东西可以辅助用户在编写代码时给出建议的类型提示,不仅可以用IDE更快速地进行开发,还能减少运行时的类型报错。
(1)Python解释器内置函数的存根文件
鼠标放到内置函数左侧的"*",提示 :Has stub item in builtins.pyi
鼠标点击*跳转到存根文件中
(2)存根文件中的@overload装饰器
函数装饰器`@overload`是Python 3.5版本引入的。它允许在一个函数中定义多个签名,这些签名对应于不同的参数类型和返回值类型。在运行时,根据函数参数类型的具体实例选择正确的签名进行调用。
下面是一个@overload装饰器的例子:
from typing import overload@overload
def create_account(username: str, password: str) -> int:pass@overload
def create_account(username: str, password: str, email: str) -> str:pass
此示例中,`create_account()`函数有两个不同的签名,对应于不同的参数类型和返回值类型。在运行时,如果调用函数带有两个参数,则第一个签名将被调用,如果带有三个参数,则第二个签名将被调用。
(3)Pycharm中给我们自定义的函数新建存根文件
Stubs | PyCharm Documentation
首先新建.py文件如下:
def my_function(name):return "Hello " + name
同目录下,新建.pyi文件,文件名要跟.py文件名一致。
存根文件内容如下:
def my_function(name: str) -> str: ...
注意,-> str: 后面的...是语法固定写法。
文件目录结构如下:
测试一下存根文件:
很容易发现Pycharm提示了:Expected type 'str', got 'int' instead,这是由于Pycharm内置了静态的类型检查器,在代码没有运行的时候就检查出来了类型错误!!这在维护大型的项目的时候是非常有用的。
3、PEP文档
PEP 484 是存根文件中类型提示的官方文档,强烈建议一读。
PEP 484是Python Enhancement Proposal中的一份提案,提出了用于类型注释的语法标准。该提案规定了Python中可用的语法和语义约定,以定义函数参数和返回类型的注释。
PEP 484提案的主要目的是增加代码的可读性和可维护性。类型注释使代码更易于理解,并且可以提供有关函数参数和返回值的有用信息,从而帮助程序员避免错误。此外,类型注释还可以使代码更易于自动化重构和重构,以及使IDE工具能够提供有关变量和函数类型的有用提示。
PEP484 官方文档译文
什么是PEP?
reference:
函数标注 — Python 3.8.16 文档
Python 类型提示
Python函数 — 类型提示和存根文件相关推荐
- python的类型提示——定义函数时的箭头符号->
在看pytorch的resnet源码时,看到这个符号觉得可以写一下(截图中的灰色高亮Resnet字样左侧) 简单的来说就是"类型提示".这个箭头符号的意思跟继承什么的没关系,意思是 ...
- python文本文件不能用二进制文件方式读入_如何使用python函数以二进制形式读取文件?...
虽然读取文件的方式各种各样,但是通过二进制,还是头一次,实现过过程并不难,我们需要将文件先做好封存,以函数的形式,保存下来,然后直接导入进行使用,这样就可以读取文件,因为直接二进制读取是不现实的,只能 ...
- Python typing —— 类型提示(type hint)
https://www.rddoc.com/doc/Python/3.6.0/zh/library/typing/ 1. 基础类型 指定参数类型和返回值类型: def greeting(name: s ...
- 全面理解Python中的类型提示(Type Hints)
众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...
- python函数返回多个值时的数据类型是_Python3 注释多个返回值的函数类型
场景 这要是讲函数注释的用法 没有返回值 def function(ver: str): print(var) 单个返回值 def function(ver: str) -> dict: a=[ ...
- python函数定义参数类型和返回值类型
python中我们也可以定义函数的参数类型和返回值类型,如下代码 #函数参数和返回值的类型声明,python函数类型的声明,更加有意义,更加实用一些 def add(a,b):''':param a: ...
- python 动态类型语言,Python 3.7.0 面向对象的动态类型语言
代表Python开发社区和Python 3.7发布团队,我们很高兴地宣布 https://www.python.org/downloads/release/python-370/ Python的大多数 ...
- 第八章 函数中的类型提示
应该强调的是,Python 仍将是一种动态类型的语言,即使按照惯例,作者也不希望强制类型提示 --Guido van Rossum, Jukka Lehtosalo, and Łukasz Langa ...
- python怎么显示提示_Python中的类型提示(中)
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 3.接口存根文件 这个选项允许你如下图一般保存你的代码: 并在原文件的旁边添加一个扩展名为pyi的文件: ...
最新文章
- 技术经理:别当超级英雄!
- 前 Google 工程师总结的算法面试指南
- angular微信支付实际url地址不同
- 解决iOS设备屏幕切换时页面造成的问题
- 数据结构二:排序(冒泡排序和选择排序)
- Vue中去掉表单对象上前后空格
- JMeter入门,测试计划编写(http请求)
- 使用.Net 1.1的项目,TreeView控件不能正常显示
- mysql部署策略_MySQL延迟问题和数据刷盘策略流程分析
- 冈萨雷斯《数字图像处理》读书笔记(十一)——表示和描述
- 10 FI配置-财务会计-把会计年度变式分配给公司代码
- [深度学习TF2] 梯度带(GradientTape)
- 编译单元必须以 java_java中什么是编译单元
- 常用的Linux关机命令!
- webpack初体验_使用webpack打包js文件_json文件_使用webpack开发模式_生产模式打包---webpack工作笔记003
- sqlCommang ADO.Net
- 渗透测试学习 十六、 常见编辑器漏洞解析
- JAVA的包装类 【转】
- linux 邮件服务器 并给外网发送邮件,Linux下判断公网IP是否改变,并发送邮件通知...
- JDK版本更换后编译android系统出错