​Python 3 新特性:类型注解

Crossin

上海交通大学 计算机应用技术硕士

95 人赞同了该文章

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

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 解释器并不会因为这些注解而提供额外的校验,没有任何的类型检查工作。也就是说,这些类型注解加不加,对你的代码来说没有任何影响:

输出:

但这么做的好处是:

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

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

输出:

在 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

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

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

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

转载于:https://www.cnblogs.com/bonelee/p/11433901.html

​Python 3 新特性:类型注解——类似注释吧,反正解释器又不做校验相关推荐

  1. Python 3 新特性:类型注解

    Python 3 新特性:类型注解 之前也看到这种写法,有人疑惑这个写法是什么意思: def add(x:int, y:int) -> int:return x + y 我们知道 Python ...

  2. 黑马程序员---基础加强-----------------第二天(新特性:注解、泛型)

    注解:相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记. 以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记, ...

  3. java annotation list_[Java5新特性]Annotation注解

    Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annotation就是提供了一种为程序元素设置元数据的方法 ...

  4. python的新特性

    http://www.jb51.net/article/67699.htm Python中用format函数格式化字符串的用法:http://www.jb51.net/article/63672.ht ...

  5. [转]关于Python里的类型注解

    我们知道 Python 是一种动态语言,在声明一个变量时我们不需要显式地声明它的类型,例如下面的例子: a = 2print('1 + a =', 1 + a) print('1 + a =', 1 ...

  6. 独家 | Python 3.10发布——你应该知道的五大新特性

    作者:Varun Singh 翻译:欧阳锦校对:王可汗本文约1700字,建议阅读5分钟 本文为大家介绍了新版本Python的新特性. 图片来源:Canva--由Varun Singh编辑 我们都知道P ...

  7. 学习笔记之-java8的新特性-函数式接口,lambda表达式,方法引用,Stream API,Optional类

    1.Lambda表达式 用匿名内部类的方法去创建多线程1.new Thread2.参数传递new Runnable3.重写run方法4.在run方法中去设置线程任务5.调用start问题:我们最终目标 ...

  8. Java 8 新特性 及 常见 面试题

    Java 8 新特性简介: 1. 代码更少(增加了新语法:Lambda 表达式) 2. 强大的 Stream API(集合数据的操作) 3. 最大化的减少空指针 异常:Optional 类 的使用 4 ...

  9. c++11的10个新特性

    C++11标准由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布[2]  ,并于2011年9月出版.2 ...

最新文章

  1. 如何理解Memory leak
  2. 浅谈Web中前后端模板引擎的使用
  3. Day9 操作系统介绍
  4. Docker容器压力测试查看CPU权重
  5. cmd mysql_CMD命令操作MySql数据库的方法详解
  6. axios拦截器_浅谈vue-resource和vue-axios的区别
  7. anaconda创建新环境_【创建社会主义新农村】怀城街道:转变整治理念 农村人居环境换新颜...
  8. pytorch torch.arange
  9. 蓝桥杯 ADV-150算法提高 周期字串
  10. Tongweb连接oracle,Tongweb优化四步骤
  11. qq等级查询php源码,最新沉沦QQ等级代挂系源码统开源分享
  12. Android Studio历史版本
  13. 条令考试小程序辅助器_小程序条令考试 微信小程序条令考试答题器
  14. Layer btnAlign 失效问题解决方法
  15. Mac上如何测试IE浏览器兼容性-虚拟机解决方案
  16. 谷歌浏览器最小化后打开黑屏
  17. 这10个问题帮你搞清楚SaaS是什么
  18. 个人空间岁末大回报活动12月26日获奖名单
  19. 我已经租不起回龙观的房子了
  20. mac插网线不能上网_Mac有线无法上网怎么办 苹果更新导致无法有线上网解决办法...

热门文章

  1. linux线程关闭信号,Linux/UNIX用同步方法处理异步信号
  2. windows10上运行linux,在Windows 10上原生运行Linux
  3. 弗林德斯大学计算机科学,想成为IT大神?就去学习弗林德斯大学计算机科学专业...
  4. python中怎么绘制柱状簇_用Python绘制簇的质心
  5. mysql 自动重启 计划_解决MYSQL死机,定时重启MYSQL,wdcp计划任务设定方法,
  6. R语言ineq算基尼系数_5 月编程语言排行榜:Java第一,R跌出Top20
  7. 博客访问量终于破10000了
  8. 【深度学习】U-Net 网络分割多分类医学图像解析
  9. 【响应式Web前端设计】在html页面实时显示系统时间
  10. 【Ubuntu入门到精通系列讲解】常用 Linux 命令的基本使用