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
投稿

猜你喜欢

  • 详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据

    2021-12-21 04:06:14
  • 深入理解python try异常处理机制

    2023-01-06 00:51:35
  • Python tkinter实现计算器功能

    2023-06-29 15:41:29
  • MacOS下本地golang环境搭建详细教程

    2024-04-26 17:24:53
  • Python基础语言学习笔记总结(精华)

    2023-08-26 21:37:23
  • Python中移除List重复项的五种方法

    2021-12-11 20:15:38
  • Python中import语句用法案例讲解

    2023-08-07 05:33:47
  • MySQL笔记之触发器的应用

    2024-01-18 17:23:32
  • pycharm快捷键汇总

    2022-12-30 22:43:40
  • SQL行号排序和分页(SQL查询中插入行号 自定义分页的另类实现)

    2012-07-21 14:45:15
  • 细化解析:轻松掌握怎样测试 MySQL安装

    2009-01-14 11:54:00
  • Python functools模块学习总结

    2023-09-22 07:21:54
  • 使用Python实现火车票查询系统(带界面)

    2022-04-26 04:14:47
  • vue-property-decorator用法详解

    2024-05-29 22:49:55
  • moment.js 时间日期处理详解

    2024-04-18 09:59:41
  • Pytorch 使用CNN图像分类的实现

    2023-04-01 03:24:21
  • python实现FTP文件传输的方法(服务器端和客户端)

    2021-03-29 23:36:08
  • 实例代码讲解Python 线程池

    2023-07-19 03:53:04
  • 完美解决SQL server2005中插入汉字变成问号的问题

    2024-01-24 20:59:59
  • 解读golang plugin热更新尝试

    2024-05-22 10:09:28
  • asp之家 网络编程 m.aspxhome.com