Python中类型检查的详细介绍


Posted in Python onFebruary 13, 2017

前言

大家都知道Python 是一门强类型、动态类型检查的语言。所谓动态类型,是指在定义变量时,我们无需指定变量的类型,Python 解释器会在运行时自动检查。

与静态类型语言(如 C 语言)相比,这不仅仅是少写了几个类型声明字符:

#include <stdlib.h>
#include <stdio.h>

#define BUFF 100

char* greeting(char* name){ 
 char* msg = (char *) malloc(sizeof(char) * BUFF);
 sprintf(msg, "Hello, %s!", name);
 return msg;
}

int main(){ 
 printf("Greeting: <%s>\n", greeting("C99"));
 return 0;
}
def greeting(name): 
 return "Hello, {}!".format(name)
def main(): 
 print("Greeting: <%s>" % greeting("Python35"))
if __name__ == '__main__': 
 main()

动态类型从一定程度上将我们的思维从对计算机的工作模拟中解放出来,可以将更多精力集中在需要解决的问题上:就像上面的例子,我们不需要费心思考虑greeting函数所接受的参数是什么类型、返回值是什么类型,而只需要考虑greeting函数需要实现的功能即可。

当然并不是说动态类型一定优于静态类型,上面的例子用 C 语言和 Python 相比也有失公允,如果换成 Go 语言:

package main

import "fmt"

func greeting(name string) string { 
 return fmt.Sprintf("Hello, %s", name)
}
func main() { 
 fmt.Printf("Greeting: <%s>", greeting("Go"))
}

静态类型的优势(从某种程度上说也是缺点)在于定义方法时制定一种强制性的协议(接口),只有遵循协议才能正确地使用。这对多人合作、开发第三方库、快速定位 BUG 等是很有帮助的。静态类型还有一大优势是可以让 IDE 帮助提示接口用法和类型检查,进一步提高效率。既然有这么多优势,那 Python 要不要也学习一个?实际上 Python 3.5 中的 PEP 484 和 Python 3.6 的PEP 526 分别加入了类型提示(Type Hints)的语法,其中 PEP 484 主要关于函数、方法、类的参数和返回值的类型声明语法,而 PEP 526添加了对变量类型的声明:

def greeting(name: str) -> str: 
 return "Hello, {}!".format(name)

Mypy

Mypy 是官方推荐一个静态类型检查工具:

python3 -m pip install mypy

可以用 mypy 命令直接检查 Python 程序:

mypy greeting.py

为了方便使用,可以将其应用到 IDE 中,以 Atom 为例,可以安装插件linter-mypy:

python3 -m pip install typed-ast 
apm install linter 
apm install linter-mypy

Python中类型检查的详细介绍

Mypy 支持的常用类型如下表所示(来自官方文档):

Python中类型检查的详细介绍

其中List/Dict/Iterable/Sequence/Any来自标准库 typing。这里的 Sequence和Iterable分别对应collections.abc.Sequencecollections.abc.Iterable,简单来区分Sequence是可以通过数字下标索引的,而Iterable可以代表生成器:

Python中类型检查的详细介绍

Python 2.x

添加了类型注释的代码可以直接通过 Python 3.5 解释器执行,但是对于 Python 2.x 则是完全不兼容的。如果要在 Python 2.x 中使用,首先需要安装 typing:

pip install typing

然后可以用单行注释的形式强行添加:

def send_email(address, # type: Union[str, List[str]] 
  sender, # type: str
  cc,  # type: Optional[List[str]]
  bcc,  # type: Optional[List[str]]
  subject='',
  body=None # type: List[str]
  ):
 # type: (...) -> bool
 """Send an email message. Return True if successful."""
 pass

总结

Python 3.5+ 从语法上支持静态类型提示,在不影响正常使用习惯的情况下为我们提供静态类型检查的功能,虽说不能与真正的静态类型语言相比,但也保证了更大的灵活性,这也符合 Python 的一贯的设计思想:“It's a tool, not a rule.”好了,以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
python创建线程示例
May 06 Python
Python是编译运行的验证方法
Jan 30 Python
用Python进行TCP网络编程的教程
Apr 29 Python
Python的MongoDB模块PyMongo操作方法集锦
Jan 05 Python
浅谈Python的垃圾回收机制
Dec 17 Python
在python中使用正则表达式查找可嵌套字符串组
Oct 24 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
Dec 25 Python
python验证码识别教程之利用滴水算法分割图片
Jun 05 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
Jun 14 Python
40行Python代码实现天气预报和每日鸡汤推送功能
Feb 27 Python
Python 如何测试文件是否存在
Jul 31 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
Feb 13 #Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 #Python
python数据清洗系列之字符串处理详解
Feb 12 #Python
python中numpy基础学习及进行数组和矢量计算
Feb 12 #Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 #Python
python3制作捧腹网段子页爬虫
Feb 12 #Python
python日志记录模块实例及改进
Feb 12 #Python
You might like
PHPlet在Windows下的安装
2006/10/09 PHP
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
Javascript 倒计时源代码.(时.分.秒) 详细注释版
2011/05/09 Javascript
js confirm()方法的使用方法实例
2013/07/13 Javascript
用javascript为页面添加天气显示实现思路及代码
2013/12/02 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
2016/05/20 Javascript
Bootstrap轮播插件简单使用方法介绍
2016/06/21 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
python关键字and和or用法实例
2015/05/28 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
2017/11/01 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
对Python 内建函数和保留字详解
2018/10/15 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
python关闭占用端口方式
2019/12/17 Python
使用PyOpenGL绘制三维坐标系实例
2019/12/24 Python
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
2014年党的群众路线活动个人整改措施
2014/10/28 职场文书
2014年人力资源工作总结
2014/11/19 职场文书
单位介绍信格式范文
2015/05/04 职场文书
学生检讨书怎么写
2015/05/07 职场文书
教师网络培训心得体会
2016/01/09 职场文书
vue+element ui实现锚点定位
2021/06/29 Vue.js