Python中类型检查的详细介绍

前言

大家都知道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 

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

其中List/Dict/Iterable/Sequence/Any来自标准库 typing。这里的 Sequence和Iterable分别对应collections.abc.Sequencecollections.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能带来一定的帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • Python之日期与时间处理模块(date和datetime)

    前言 在开发工作中,我们经常需要用到日期与时间,如: 作为日志信息的内容输出 计算某个功能的执行时间 用日期命名一个日志文件的名称 记录或展示某文章的发布或修改时间 其他 Python中提供了多个用于对日期和时间进行操作的内置模块:time模块.datetime模块和calendar模块.其中time模块是通过调用C库实现的,所以有些方法在某些平台上可能无法调用,但是其提供的大部分接口与C标准库time.h基本一致.time模块相比,datetime模块提供的接口更直观.易用,功能也更加强大.

  • 利用python程序生成word和PDF文档的方法

    一.程序导出word文档的方法 将web/html内容导出为world文档,再java中有很多解决方案,比如使用Jacob.Apache POI.Java2Word.iText等各种方式,以及使用freemarker这样的模板引擎这样的方式.php中也有一些相应的方法,但在python中将web/html内容生成world文档的方法是很少的.其中最不好解决的就是如何将使用js代码异步获取填充的数据,图片导出到word文档中. 1. unoconv 功能: 1.支持将本地html文档转换为docx

  • Python爬虫:通过关键字爬取百度图片

    使用工具:Python2.7 点我下载 scrapy框架 sublime text3 一.搭建python(Windows版本)  1.安装python2.7 ---然后在cmd当中输入python,界面如下则安装成功  2.集成Scrapy框架----输入命令行:pip install Scrapy 安装成功界面如下: 失败的情况很多,举例一种: 解决方案: 其余错误可百度搜索. 二.开始编程. 1.爬取无反爬虫措施的静态网站.例如百度贴吧,豆瓣读书. 例如-<桌面吧>的一个帖子https:

  • Python 遍历列表里面序号和值的方法(三种)

    三种遍历列表里面序号和值的方法: 最近学习python这门语言,感觉到其对自己的工作效率有很大的提升,特在情人节这一天写下了这篇博客,下面废话不多说,直接贴代码 #!/usr/bin/env python # -*- coding: utf-8 -*- if __name__ == '__main__': list = ['html', 'js', 'css', 'python'] # 方法1 print '遍历列表方法1:' for i in list: print ("序号:%s 值:%s&

  • 利用Python爬虫给孩子起个好名字

    前言 相信每位家长都有所体会,因为要在孩子出生后两周内起个名字(需要办理出生证明了),估计很多人都像我一样,刚开始是很慌乱的,虽然感觉汉字非常的多随便找个字做名字都行,后来才发现真不是随便的事情,怎么想都发现不合适,于是到处翻词典.网上搜.翻唐诗宋词.诗经.甚至武侠小说,然而想了很久得到的名字,往往却受到家属的意见和反对,比如不顺口.和亲戚重名重音等问题,这样就陷入了重复寻找和否定的循环,越来越混乱. 于是我们再次回到网上各种搜索,找到很多网上给出的"男宝宝好听的名字大全"之类的文章,

  • 使用PyV8在Python爬虫中执行js代码

    前言 可能很多人会觉得这是一个奇葩的需求,爬虫去好好的爬数据不就行了,解析js干嘛?吃饱了撑的? 搜索一下互联网上关于这个问题还真不少,但是大多数童鞋是因为自己的js基础太烂,要么是HTML基础烂,要么ajax基础烂,反正各方面都很烂.基础这么渣不好好去学基础写什么爬虫? 那你肯定要问了"请问我的朋友,你TM怎么也有这个需求?莫非你是个技术渣?" 非也非也,博主作为一个拥有3年多前端经验的攻城尸,怎么会被这个问题给难倒呢,老夫今天遇到的问题很显然没有那么简单. 问题 那么博主到底是遇到

  • 关于Python面向对象编程的知识点总结

    前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们就来了解关于Python面向对象编程的知识点吧. 类与实例 类是对象的定义,而实例是"真正的实物",它存放了类中所定义的对象的具体信息. 类.属性和方法命名规范 类名通常由大写字母打头.这是标准惯例,可以帮助你识别类,特别是在实例化过程中(有时看起来像函数调用).还有,数据属性(变量或常量

  • Python 模块EasyGui详细介绍

    Python 模块EasyGui详细介绍 前言: 在Windows想用Python开发一些简单的界面,所以找到了很容易上手的EasyGui库.下面就分享一下简单的使用吧. 参考的链接:官网Tutorial 接下来,我将从简单,到复杂一点点的演示如何使用这个模块.希望能给刚接触easygui的你一点帮助 :-) msgBox,ccbox,ynbox # coding:utf-8 # __author__ = 'Mark sinoberg' # __date__ = '2016/5/25' # __

  • Python中类型检查的详细介绍

    前言 大家都知道Python 是一门强类型.动态类型检查的语言.所谓动态类型,是指在定义变量时,我们无需指定变量的类型,Python 解释器会在运行时自动检查. 与静态类型语言(如 C 语言)相比,这不仅仅是少写了几个类型声明字符: #include <stdlib.h> #include <stdio.h> #define BUFF 100 char* greeting(char* name){ char* msg = (char *) malloc(sizeof(char) *

  • Python各种类型装饰器详细介绍

    目录 装饰器说明 装饰器分类 最简单的装饰器 用于修改对象的装饰器 用于模拟对象的装饰器--函数装饰器 用于模拟对象的装饰器--类方法装饰器 用于模拟对象的装饰器--类装饰器 特殊应用的装饰器 类实现的装饰器 装饰带参数/返回值的对象 装饰器带参数 装饰器应用 装饰器说明 Python中的装饰器是一种可以装饰其它对象的工具.该工具本质上是一个可调用的对象(callable),所以装饰器一般可以由函数.类来实现.装饰器本身需要接受一个被装饰的对象作为参数,该参数通常为函数.方法.类等对象.装饰器需

  • python中使用mysql数据库详细介绍

    一.安装mysql 如果是windows 用户,mysql 的安装非常简单,直接下载安装文件,双击安装文件一步一步进行操作即可. Linux 下的安装可能会更加简单,除了下载安装包进行安装外,一般的linux 仓库中都会有mysql ,我们只需要通过一个命令就可以下载安装: Ubuntu\deepin 复制代码 代码如下: >>sudo apt-get install mysql-server >>Sudo apt-get install  mysql-client centOS/

  • Python中的tuple元组详细介绍

    Tuple 是不可变 list. 一旦创建了一个 tuple 就不能以任何方式改变它. Tuple 与 list 的相同之处 定义 tuple 与定义 list 的方式相同, 除了整个元素集是用小括号包围的而不是方括号. Tuple 的元素与 list 一样按定义的次序进行排序. Tuples 的索引与 list 一样从 0 开始, 所以一个非空 tuple 的第一个元素总是 t[0]. 负数索引与 list 一样从 tuple 的尾部开始计数. 与 list 一样分片 (slice) 也可以使

  • Python中Parser的超详细用法实例

    目录 1 前言 2.使用方法 2.1 实例化ArgumentParser 2.2 使用add_argument函数添加参数 2.3 add_argument() 方法定义如何解析命令行参数 2.4 使用parse_args解析参数 3 案例实践:action的可选参数store_true的作用 附:python-Parser使用步骤记忆 总结 这次主要记录python-Parser的用法,以及可能遇到的系列操作. 1 前言 if __name__ == "__main__": #Add

  • python实现微信接口(itchat)详细介绍

    前言 itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单.使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人.当然,该api的使用远不止一个机器人,更多的功能等着你来发现,比如这些.该接口与公众号接口itchatmp共享类似的操作方式,学习一次掌握两个工具.如今微信已经成为了个人社交的很大一部分,希望这个项目能够帮助你扩展你的个人的微信号.方便自己的生活. 安装 sudo pip install itchat 登录 itchat.auto_login()

  • Python中类型关系和继承关系实例详解

    本文详细介绍了Python中类型关系和继承关系.分享给大家供大家参考.具体分析如下: 如果一个对象A持有另一个对象B的ID,那么检索到A之后就可以检索到B,我们就说存在一个A到B的导航.这种导航关系使得Python中所有对象之间形成了一个复杂的网络结构. Python程序的运行包括: 1. 修改这个网络结构: 2. 执行有副作用的代码对象(code object或者说bytecode,见Python Language Reference 3.2) (副作用是指影响Python虚拟机之外的设备,这

  • Maven中pom.xml配置文件详细介绍

    setting.xml主要用于配置maven的运行环境等一系列通用的属性,是全局级别的配置文件:而pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件. 基础配置 一个典型的pom.xml文件配置如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org

  • Python静态类型检查新工具之pyright 使用指南

    Python是一门动态类型的语言,民间流传一种说法叫"动态一时爽,重构火葬场",听起来够吓人的,好在这门语言在不断地改进,包括对 PEP484 引入的类型提示(Type Hint),就是在某种程度上,让Python能够像静态语言一样支持类型声明,例如: def greeting(name: str) -> str: return 'Hello ' + name 这就意味着,如果有人调用 greeting函数的时候,传入的参数不是字符串,你用静态类型检查工具一下就能查出来哪些地方没

  • for循环在Python中的工作原理详细

    例如: 作用于列表 >>> for elem in [1,2,3]: ... print(elem) ... 1 2 3 作用于字符串 >>> for c in "abc": ... print(c) ... a b c 作用于字典 >>> for k in {"age":10, "name":"wang"}: ... print(k) ... age name 可能有人不

随机推荐