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 05 Python
Python面向对象编程基础解析(二)
Oct 26 Python
Python将多份excel表格整理成一份表格
Jan 03 Python
pandas 使用apply同时处理两列数据的方法
Apr 20 Python
pycharm运行和调试不显示结果的解决方法
Nov 30 Python
python如何将多个PDF进行合并
Aug 13 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
Aug 28 Python
python数据持久存储 pickle模块的基本使用方法解析
Aug 30 Python
Python实现语音识别和语音合成功能
Sep 20 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
Apr 27 Python
python之语音识别speech模块
Sep 09 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
Sep 21 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详细彻底学习Smarty
2008/03/27 PHP
php Undefined index和Undefined variable的解决方法
2008/03/27 PHP
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
PHP实现小偷程序实例
2016/10/31 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
jquery淡入淡出效果简单实例
2016/01/14 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
微信小程序 轮播图实现原理及优化详解
2019/09/29 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
Node绑定全局TraceID的实现方法
2019/11/14 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
Python开发WebService系列教程之REST,web.py,eurasia,Django
2014/06/30 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
html5 音乐播放器 audio 标签使用概述
2013/07/15 HTML / CSS
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
南京迈特望C/C++面试题
2012/07/09 面试题
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
欢迎词范文
2015/01/27 职场文书
上下班时间调整通知
2015/04/23 职场文书
VMware虚拟机安装 Windows Server 2022的详细图文教程
2022/09/23 Servers