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来开发Markdown脚本扩展的实例分享
Mar 04 Python
利用Python命令行传递实例化对象的方法
Nov 02 Python
python爬虫实战之最简单的网页爬虫教程
Aug 13 Python
简单谈谈Python的pycurl模块
Apr 07 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
Oct 11 Python
Python基础教程之异常详解
Jan 10 Python
新手如何发布Python项目开源包过程详解
Jul 11 Python
解决pycharm最左侧Tool Buttons显示不全的问题
Dec 17 Python
PyQt中使用QtSql连接MySql数据库的方法
Jul 28 Python
浅析python 字典嵌套
Sep 29 Python
Python抖音快手代码舞(字符舞)的实现方法
Feb 07 Python
深入浅析Django MTV模式
Sep 04 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遍历数组的几种方法
2012/03/22 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
深入剖析浏览器退出之后php还会继续执行么
2016/05/17 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
自己的js工具_Form 封装
2009/08/21 Javascript
jQuery UI 应用不同Theme的办法
2010/09/12 Javascript
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
javascript 实现子父窗体互相传值的简单实例
2014/02/17 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
利用原生JavaScript获取元素样式只是获取而已
2014/10/08 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
JavaScript中的继承方式详解
2015/02/11 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
2020/02/16 Javascript
Vue之封装公用变量以及实现方式
2020/07/31 Javascript
[10:05]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD 选手采访
2021/03/11 DOTA
利用python获取Ping结果示例代码
2017/07/06 Python
Django  ORM 练习题及答案
2019/07/19 Python
浅谈python锁与死锁问题
2020/08/14 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
纽约复古灵感的现代珠宝品牌:Lulu Frost
2018/03/03 全球购物
波兰在线运动商店:YesSport
2020/07/23 全球购物
会计主管岗位职责范文
2013/11/08 职场文书
市场营销专业自荐书
2014/06/10 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书