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的Flask框架中实现登录用户的个人资料和头像的教程
Apr 20 Python
python实现从ftp服务器下载文件的方法
Apr 30 Python
python图像常规操作
Nov 11 Python
Python操作Redis之设置key的过期时间实例代码
Jan 25 Python
Python实现matplotlib显示中文的方法详解
Feb 06 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
Flask框架实现给视图函数增加装饰器操作示例
Jul 16 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
Nov 29 Python
Python多线程实现支付模拟请求过程解析
Apr 21 Python
实例代码讲解Python 线程池
Aug 24 Python
浅析Python 责任链设计模式
Sep 11 Python
详解使用scrapy进行模拟登陆三种方式
Feb 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作的文本留言本的例子(五)
2006/10/09 PHP
php 特殊字符处理函数
2008/09/05 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
js渐变显示渐变消失示例代码
2013/08/01 Javascript
对frameset、frame、iframe的js操作示例代码
2013/08/16 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
js实现一个简单的数字时钟效果
2017/03/29 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
在vue项目中使用element-ui的Upload上传组件的示例
2018/02/08 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
Python处理json字符串转化为字典的简单实现
2016/07/07 Python
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
详解django2中关于时间处理策略
2019/03/06 Python
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
win10安装python3.6的常见问题
2020/07/01 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
python实现按日期归档文件
2021/01/30 Python
英国最大的香水商店:The Fragrance Shop
2018/07/06 全球购物
比较一下entity bean和session bean
2013/12/27 面试题
外贸实习生自荐信范文
2013/11/24 职场文书
央视元宵晚会主持串词
2014/03/25 职场文书
工伤事故赔偿协议书
2014/04/15 职场文书
教师教学评估方案
2014/05/09 职场文书
给市场的环保建议书
2014/05/14 职场文书
店铺转让协议书
2014/12/02 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
理想国读书笔记
2015/06/25 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技