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 getopt 参数处理小示例
Jun 09 Python
python从入门到精通(DAY 2)
Dec 20 Python
windows上安装Anaconda和python的教程详解
Mar 28 Python
Python3数据库操作包pymysql的操作方法
Jul 16 Python
对numpy中的transpose和swapaxes函数详解
Aug 02 Python
python定时按日期备份MySQL数据并压缩
Apr 19 Python
Python笔记之工厂模式
Nov 20 Python
Python字典底层实现原理详解
Dec 18 Python
理解Django 中Call Stack机制的小Demo
Sep 01 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
Oct 18 Python
Python基于template实现字符串替换
Nov 27 Python
pytorch 如何把图像数据集进行划分成train,test和val
May 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
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
php地址引用(php地址引用的效率问题)
2012/03/23 PHP
php+mysqli实现批量执行插入、更新及删除数据的方法
2015/01/29 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
2015/09/30 PHP
php cli配置文件问题分析
2015/10/15 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
超级退弹代码
2008/07/07 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
把字符串按照特定的字母顺序进行排序的js代码
2014/01/28 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
2014/02/11 Javascript
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
2016/04/14 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
用Webpack构建Vue项目的实践
2017/11/07 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
JavaScript&quot;模拟事件&quot;的注意要点详解
2019/02/13 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
windows下安装Python和pip终极图文教程
2017/03/05 Python
python的dataframe和matrix的互换方法
2018/04/11 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
2018/12/20 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
大学生的网上创业计划书
2013/12/31 职场文书
如何写自我鉴定
2014/03/19 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
社区护士演讲稿
2014/08/27 职场文书
债务追讨授权委托书范本
2014/10/16 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
医生辞职信范文
2015/03/02 职场文书
2016国培学习心得体会
2016/01/08 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书