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函数 — 类型提示和存根文件相关推荐

  1. python的类型提示——定义函数时的箭头符号->

    在看pytorch的resnet源码时,看到这个符号觉得可以写一下(截图中的灰色高亮Resnet字样左侧) 简单的来说就是"类型提示".这个箭头符号的意思跟继承什么的没关系,意思是 ...

  2. python文本文件不能用二进制文件方式读入_如何使用python函数以二进制形式读取文件?...

    虽然读取文件的方式各种各样,但是通过二进制,还是头一次,实现过过程并不难,我们需要将文件先做好封存,以函数的形式,保存下来,然后直接导入进行使用,这样就可以读取文件,因为直接二进制读取是不现实的,只能 ...

  3. Python typing —— 类型提示(type hint)

    https://www.rddoc.com/doc/Python/3.6.0/zh/library/typing/ 1. 基础类型 指定参数类型和返回值类型: def greeting(name: s ...

  4. 全面理解Python中的类型提示(Type Hints)

    众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...

  5. python函数返回多个值时的数据类型是_Python3 注释多个返回值的函数类型

    场景 这要是讲函数注释的用法 没有返回值 def function(ver: str): print(var) 单个返回值 def function(ver: str) -> dict: a=[ ...

  6. python函数定义参数类型和返回值类型

    python中我们也可以定义函数的参数类型和返回值类型,如下代码 #函数参数和返回值的类型声明,python函数类型的声明,更加有意义,更加实用一些 def add(a,b):''':param a: ...

  7. python 动态类型语言,Python 3.7.0 面向对象的动态类型语言

    代表Python开发社区和Python 3.7发布团队,我们很高兴地宣布 https://www.python.org/downloads/release/python-370/ Python的大多数 ...

  8. 第八章 函数中的类型提示

    应该强调的是,Python 仍将是一种动态类型的语言,即使按照惯例,作者也不希望强制类型提示 --Guido van Rossum, Jukka Lehtosalo, and Łukasz Langa ...

  9. python怎么显示提示_Python中的类型提示(中)

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 3.接口存根文件 这个选项允许你如下图一般保存你的代码: 并在原文件的旁边添加一个扩展名为pyi的文件: ...

最新文章

  1. 技术经理:别当超级英雄!
  2. 前 Google 工程师总结的算法面试指南
  3. angular微信支付实际url地址不同
  4. 解决iOS设备屏幕切换时页面造成的问题
  5. 数据结构二:排序(冒泡排序和选择排序)
  6. Vue中去掉表单对象上前后空格
  7. JMeter入门,测试计划编写(http请求)
  8. 使用.Net 1.1的项目,TreeView控件不能正常显示
  9. mysql部署策略_MySQL延迟问题和数据刷盘策略流程分析
  10. 冈萨雷斯《数字图像处理》读书笔记(十一)——表示和描述
  11. 10 FI配置-财务会计-把会计年度变式分配给公司代码
  12. [深度学习TF2] 梯度带(GradientTape)
  13. 编译单元必须以 java_java中什么是编译单元
  14. 常用的Linux关机命令!
  15. webpack初体验_使用webpack打包js文件_json文件_使用webpack开发模式_生产模式打包---webpack工作笔记003
  16. sqlCommang ADO.Net
  17. 渗透测试学习 十六、 常见编辑器漏洞解析
  18. JAVA的包装类 【转】
  19. linux 邮件服务器 并给外网发送邮件,Linux下判断公网IP是否改变,并发送邮件通知...
  20. JDK版本更换后编译android系统出错

热门文章

  1. grafana+alertmanager 微信报警发送给不同告警人
  2. win10系统下MyEclipse10.7的激活
  3. 【监听器篇】4.统计当前在线的用户人数
  4. css实现六边形及其它灵活布局
  5. 第三章微分中值定理及导数应用(柯西中值和泰勒公式)
  6. 回顾知识点:计算机网络篇
  7. 安装系列—火狐浏览器添加组件‘firebug’却无法找到?
  8. webpack学习总结
  9. 力天创见热区统计方案
  10. 时间序列预测之移动平均法(MA)