Python中类型检查的详细介绍

作者:Yusheng 时间:2022-08-18 16:51:47 

前言

大家都知道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能带来一定的帮助,如果有疑问大家可以留言交流。

来源:http://blog.rainy.im/2017/01/20/python-type-hints/

标签:python,数据,类型
0
投稿

猜你喜欢

  • MySQL中的字符串模式匹配

    2010-03-09 16:30:00
  • golang操作mongodb的方法

    2023-09-15 03:49:24
  • 实例简析XPath串函数和XSLT

    2008-09-04 14:16:00
  • PHP+Mysql基于事务处理实现转账功能的方法

    2023-10-21 16:53:06
  • 简单实用的图片播放器1.0(Javascript + css )

    2008-07-16 10:39:00
  • 在ASP中按指定参数格式化显示时间的函数。

    2010-05-27 12:29:00
  • 手机网站开发必修课[2009总结版]

    2010-01-05 17:02:00
  • asp如何准确获知对方来访问的时间和URL?

    2010-07-07 12:25:00
  • PHP实现无限极分类的两种方式示例【递归和引用方式】

    2023-11-15 18:26:33
  • sql server对字段的添加修改删除、以及字段的说明

    2012-01-05 18:50:52
  • 目前最全的浏览器/CSS选择器兼容性总结(包括Safari 4 beta)

    2009-02-26 15:26:00
  • 亚马逊购物用户体验分析(三)

    2009-10-25 12:53:00
  • Python NumPy实用函数笔记之allclose

    2023-08-24 18:09:12
  • Javascript简单实现可拖动的div

    2013-08-20 11:46:37
  • Python实现注册、登录小程序功能

    2022-12-03 17:50:11
  • Python解析命令行读取参数--argparse模块使用方法

    2023-06-28 22:48:45
  • Mysql Innodb 引擎优化

    2010-10-25 20:01:00
  • 构建成功web应用的十项黄金法则

    2010-09-17 19:11:00
  • SqlServer 巧妙解决多条件组合查询

    2023-07-01 14:15:00
  • PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)

    2023-10-02 13:10:01
  • asp之家 网络编程 m.aspxhome.com