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字典数据对象拆分的简单实现方法
Dec 05 Python
Python实现求数列和的方法示例
Jan 12 Python
Tensorflow使用支持向量机拟合线性回归
Sep 07 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 Python
python使用tomorrow实现多线程的例子
Jul 20 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
Aug 12 Python
Python OpenCV图像指定区域裁剪的实现
Oct 30 Python
python代码区分大小写吗
Jun 17 Python
通过实例了解Python异常处理机制底层实现
Jul 23 Python
Python如何读写二进制数组数据
Aug 01 Python
Pytorch实现图像识别之数字识别(附详细注释)
May 11 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
php5数字型字符串加解密代码
2008/04/24 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
jquery获取html元素的绝对位置和相对位置的方法
2014/06/20 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
2016/05/30 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
10道典型的JavaScript面试题
2017/03/22 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
2017/08/18 jQuery
js实现鼠标跟随运动效果
2020/08/02 Javascript
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
详解Ubuntu安装angular-cli遇到的坑
2018/09/08 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
python解析文件示例
2014/01/23 Python
Tornado 多进程实现分析详解
2018/01/12 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
三个python爬虫项目实例代码
2019/12/28 Python
python实现高斯投影正反算方式
2020/01/17 Python
使用AJAX和Django获取数据的方法实例
2020/10/25 Python
python中的插入排序的简单用法
2021/01/19 Python
购买中国最好的电子产品:Geekbuying
2018/03/13 全球购物
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
中学教师岗位职责
2013/11/26 职场文书
好听的队名和口号
2014/06/09 职场文书
精神病医院见习报告
2014/11/03 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
义卖募捐活动总结
2015/05/09 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python
python中取整数的几种方法
2021/11/07 Python