当前位置: 首页 > news >正文

​Python 3 新特性:类型注解

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

前几天有同学问到,这个写法是什么意思:

def add(x:int, y:int) -> int:
    return x + y

我们知道 Python 是一种动态语言,变量以及函数的参数是不区分类型。因此我们定义函数只需要这样写就可以了:

def add(x, y):
    return x + y

这样的好处是有极大的灵活性,但坏处就是对于别人代码,无法一眼判断出参数的类型,IDE 也无法给出正确的提示。

于是 Python 3 提供了一个新的特性:
函数注解

也就是文章开头的这个例子:

def add(x:int, y:int) -> int:
    return x + y

: 类型 的形式指定函数的参数类型,用 -> 类型 的形式指定函数的返回值类型。

然后特别要强调的是,Python 解释器并不会因为这些注解而提供额外的校验,没有任何的类型检查工作。也就是说,这些类型注解加不加,对你的代码来说没有任何影响

31205752_DK6G.jpg

输出:

31205752_lchP.jpg

但这么做的好处是:

  1. 让别的程序员看得更明白
  2. 让 IDE 了解类型,从而提供更准确的代码提示、补全和语法检查(包括类型检查,可以看到 str 和 float 类型的参数被高亮提示)
31205752_HzQK.jpg

在函数的 __annotations__ 属性中会有你设定的注解:

31205752_HpBg.jpg

输出:

31205752_duMH.jpg

在 Python 3.6 中,又引入了对变量类型进行注解的方法:

a: int = 123
b: str = 'hello'

更进一步,如果你需要指明一个全部由整数组成的列表:

from typing import List
l: List[int] = [1, 2, 3]

但同样,这些仅仅是“注解”,不会对代码产生任何影响。

不过,你可以通过 mypy 库来检验最终代码是否符合注解。

安装 mypy:

pip install mypy

执行代码:

mypy test.py

如果类型都符合,则不会有任何输出,否则就会给出类似输出:

31205752_yjFa.jpg

这些新特性也许你并不会在代码中使用,不过当你在别人的代码中看到时,请按照对方的约定进行赋值或调用。

当然,也不排除 Python 以后的版本把类型检查做到解释器里,谁知道呢。


════
其他文章及回答:

如何自学Python | 新手引导 | 精选Python问答 | Python单词表 | 区块链 | 人工智能

欢迎关注:Crossin的编程教室

转载于:https://my.oschina.net/crossin/blog/1822124

相关文章:

  • 年会全记录 | Hi,菜鸟,五周岁生日快乐哇!
  • Swift 项目总结 06 基于控制器的全局状态栏管理
  • 织梦网站安装目录更换后,怎么更换上传网站中图片路径
  • 【Android Studio安装部署系列】二十四、Android studio中Gradle插件版本和Gradle版本关系...
  • 基于 HTML5 WebGL 的 3D 棉花加工监控系统
  • 16-client、offset、scroll系列
  • 数据结构之 二叉树
  • 【Touchinput 】指定输入方法类型(11)
  • iOS中父类readonly属性修改
  • μCOS-II系统之事件(event)的使用规则及MUTEX实例
  • 之所以一无所成,并不是我们不够努力
  • [转]Ubuntu16 压缩解压文件命令
  • 数组全部整理
  • corosync+pacemaker配置高可用集群(需要额外安装crm工具)
  • Vmvare 虚拟机固定IP
  • 【刷算法】求1+2+3+...+n
  • Android交互
  • crontab执行失败的多种原因
  • exif信息对照
  • gitlab-ci配置详解(一)
  • Java超时控制的实现
  • Linux CTF 逆向入门
  • Netty源码解析1-Buffer
  • SpiderData 2019年2月13日 DApp数据排行榜
  • springMvc学习笔记(2)
  • windows下mongoDB的环境配置
  • 番外篇1:在Windows环境下安装JDK
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 普通函数和构造函数的区别
  • 强力优化Rancher k8s中国区的使用体验
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一起参Ember.js讨论、问答社区。
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 自定义函数
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #includecmath
  • (12)Hive调优——count distinct去重优化
  • (C#)获取字符编码的类
  • (C#)一个最简单的链表类
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (附源码)php投票系统 毕业设计 121500
  • (论文阅读30/100)Convolutional Pose Machines
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)jQuery 基础
  • (转)为C# Windows服务添加安装程序
  • *p++,*(p++),*++p,(*p)++区别?
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET CLR基本术语
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法