众所周知, Python 是一门强类型、动态类型检查的语言。所谓动态类型,是指在定义变量时,我们无需指定变量的类型,Python 解释器会在运行时自动检查。与静态类型语言(如 C 语言)相比,这不仅仅是少写了几个类型声明字符:

#include

#include

#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: \n", greeting("C99"));

return 0;

}

def greeting(name):

return "Hello, {}!".format(name)

def main():

print("Greeting: " % 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: ", 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

Mypy 支持的常用类型如下表所示(来自官方文档):

其中List/Dict/Iterable/Sequence/Any来自标准库 typing。这里的 Sequence和Iterable分别对应collections.abc.Sequence和collections.abc.Iterable,简单来区分Sequence是可以通过数字下标索引的,而Iterable可以代表生成器:

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 mypy类型检查_Python 类型检查相关推荐

  1. python mypy类型检查_Python 类型检查指南

    Python 作为一种动态语言,在 PEP484(3.5) 才支持 Type Hints,且类型申明是 optional 的,对于从静态语言(比如:Java,国内大学专业cs or se的教学语言也是 ...

  2. python代码质量检查工具_python代码检查工具pylint 让你的python更规范

    复制代码 代码如下: #coding:utf-8 ''' a test function module ''' import urllib import time def fetch(url): '' ...

  3. python列表索引负数_python – 如何检查列表索引是否存在?

    你只需要检查你想要的索引是否在0的范围和列表的长度,像这样 if 0 <= index < len(list): 实际上是内部评估 if (0 <= index) and (inde ...

  4. python设置循环范围_python – 如何检查循环范围的重叠(重叠的年度循环周期)

    我试图找到一个优雅的算法,以检查两个年度重复周期是否重叠.这个时期与年份无关,但一年可能总是闰年. 例如,期间A =(3月1日至5月1日)和期间B =(4月1日至9月1日)重叠. 此外,期间A =(1 ...

  5. python奇数的表达式_python – 递归检查奇数或偶数

    在找到基本情况之前,总是有助于分解递归关系. is_even(2) => return is_odd(1) => return not is_even(1) => return no ...

  6. python参数检查类型_Python类型检查

    python参数检查类型 1.什么是类型检查? (1. What is Type Checking?) Type Checking is the programming language featur ...

  7. python 学习指南_Python类型检查终极指南

    python 学习指南 In this guide, you will get a look into Python type checking. Traditionally, types have ...

  8. python参数类型检查_Python中的类型检查

    本文中所有代码均运行在Python 2.7上 为什么要进行类型检查? 总所周知,Python是一门典型的动态语言,在变量定义.使用的过程中遵循duck typing,当对某一变量进行操作时才去检查它是 ...

  9. python函数参数类型检查_Python中实现参数类型检查的简单方法

    Python是一门弱类型语言,很多从C/C++转过来的朋友起初不是很适应.比如,在声明一个函数时,不能指定参数的类型.用C做类比,那就是所有参数都是void*类型!void类型强制转换在C++中被广泛 ...

最新文章

  1. 表贴光电池 FU-NJL6402R-2 的特性
  2. java 注解_通俗易懂的讲解下Java注解
  3. getId()方法的作用
  4. linux的php优化,linux优化转载
  5. DotNetNuke与MemberShip的结合(五年版) 三步汇总
  6. php动态添加查询,php动态添加url查询参数的方法,php动态url参数_PHP教程
  7. log4net 小记
  8. 学校机房为什么要穿鞋套?
  9. 系统服务器地云盘上,系统服务器地云盘上
  10. 《Flume日志收集与MapReduce模式》一2.1 下载Flume
  11. NAT- STUN和TURN简介
  12. matlab时频分析
  13. 基于Tableau探索分析世界银行提供的关于科学技术的数据
  14. fgo最新服务器,如何看fgo是什么服务器 | 手游网游页游攻略大全
  15. VLAN与三层交换机
  16. 豆瓣读书数据分析实战
  17. python写excel宏_使用python执行excel的VBA(宏)
  18. Android设备root及xposedPrivacy的安装
  19. Profibus DP-Slave in C
  20. word图文混排复制到FCKEditor图片不显示

热门文章

  1. linux系统使用R语言,R语言-基础操作
  2. 为什么 没4k万 别来找我
  3. Linux自学指南-从应用到内核
  4. using-fastcgi-to-host-php-applications-on-iis7
  5. 数码相机做摄像头_如何将数码相机用作网络摄像头
  6. 比尔盖茨给年轻人的忠告
  7. java面试题目 5
  8. Java编程判断一个数是否是回文数
  9. 使用C#编写一个计时器-.NET教程,C#语言
  10. 前k个高频元素c语言,90年代初自己接了一个项目编写(汇编Z80单板机传呼机高频(发射机)POCSAG 编码系统)...