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实现手机通讯录搜索功能
Feb 22 Python
使用python画个小猪佩奇的示例代码
Jun 06 Python
不知道这5种下划线的含义,你就不算真的会Python!
Oct 09 Python
django 自定义filter 判断if var in list的例子
Aug 20 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 Python
Django Admin 上传文件到七牛云的示例代码
Jun 20 Python
浅谈pytorch中的BN层的注意事项
Jun 23 Python
Python绘图之柱形图绘制详解
Jul 28 Python
Python如何绘制日历图和热力图
Aug 07 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
Sep 04 Python
Python APScheduler执行使用方法详解
Dec 10 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
PHP+DBM的同学录程序(2)
2006/10/09 PHP
Lumen timezone 时区设置方法(慢了8个小时)
2018/01/20 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
Add Formatted Data to a Spreadsheet
2007/06/12 Javascript
JQuery学习笔录 简单的JQuery
2012/04/09 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
js window.open弹出新的网页窗口
2014/01/16 Javascript
总结JavaScript的正则与其他语言的不同之处
2016/08/25 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
JS三目运算(三元运算)方法详解
2017/03/01 Javascript
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
vue实现计算器功能
2020/02/22 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
[02:13] 完美世界DOTA2联赛PWL DAY5集锦
2020/11/03 DOTA
[原创]pip和pygal的安装实例教程
2017/12/07 Python
python实现括号匹配的思路详解
2018/08/23 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
Python实现投影法分割图像示例(一)
2020/01/17 Python
Python龙贝格法求积分实例
2020/02/29 Python
python中format函数如何使用
2020/06/22 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
Photobook澳大利亚:制作相片书,婚礼卡,旅行相簿
2017/01/12 全球购物
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
个人简历自我评价
2014/02/02 职场文书
会计试用期自我评价
2014/09/19 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
会计求职自荐信范文
2015/03/04 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
男生贾里读书笔记
2015/06/30 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书
Python快速实现一键抠图功能的全过程
2021/06/29 Python
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python