使用 mypy 做 type check

前言

完残!😂,最近看之前写的 Python 代码老得琢磨这比变量的类型是啥(Python 无类型系统xxx),不愧是我写的!

看段之前写的实现迭代器模式的代码:

# 抽象迭代器类
class Iterator(object):def hasNext():passdef next():pass# 抽象聚集类
class Aggregate(object):def iterator():passclass BookShelf(Aggregate):def __init__(self):self._books = []self._last = 0def getBookAt(self, index):return self._books[index]def appendBook(self, book):self._books.append(book)self._last = self._last + 1def getLength(self):return self._lastdef iterator(self):return BookShelfIterator(self)class BookShelfIterator(Iterator):def __init__(self, bookShelf):self._bookShelf = bookShelfself._index = 0def hasNext(self):if self._index < self._bookShelf.getLength():return Trueelse:return Falsedef next(self):book = self._bookShelf.getBookAt(self._index)self._index = self._index + 1return bookclass Book():def __init__(self, name):self._name = namedef getName(self):return self._nameif __name__ == "__main__":bookShelf = BookShelf()bookShelf.appendBook(Book("A"))bookShelf.appendBook(Book("B"))bookShelf.appendBook(Book("C"))bookShelf.appendBook(Book("D"))it = bookShelf.iterator()while it.hasNext():book = it.next()print(book.getName())

有一丢丢难读(不通读的话,会乱猜某变量类型),回想之前在 PyCon China 2019 的大会资聊曾看到过类型检查相关的演讲主题,回顾下演讲视频。水一波,写篇文章了解下 Python 标准(PEP 3107 & PEP 484 )支持的 mypy。

类型系统:编译期的类型推导检查规则,类型系统属于一种轻量级的形式化方法(一种数学方法)

使用-mypy

# 安装 mypy
pip install mypy
# 使用 mypy 做类型检查
mypy module_name.py

以下使用方式适用于 Python 3.6 及以上的版本。值得注意:mypy 默认的推导类型不可为 None

变量的类型注释

integer: int = 1
string: str = "ShanSan"
err_str: str = 1  # error: Incompatible types in assignment
child: bool = True
# mypy 默认的推导类型不可为 None
none: int - None  # error: Invalid type comment or annotationprint(integer, string)

内建类型

关于更多 mypy 的类型系统内建的类型可参考:https://mypy.readthedocs.io/en/stable/builtin_types.html

from typing import Dict, Tuple, Optional, Iterable, Union
# 对于映射(Map)数据结构,需要指定 key 和 value 的类型
x: Dict[str, float] = {'field': 2.0}# Tuple 需要指定所有元素的类型
x: Tuple[int, str, float] = (3, "yes", 7.5)# error: Incompatible types in assignment (expression has type "Tuple[int, str, float, int]", variable has type "Tuple[int, str, float]")
y: Tuple[int, str, float] = (3, "yes", 7.5, 11)op: Optional[str] = None  # 可为 str 或 None# 泛用可迭代对象
l: Iterable = [1]
t: Iterable = (1, 2)
d: Iterable = {1: 1}# 可为 str 或 int
str_int1: Union[str, int] = 1
str_int2: Union[str, int] = "ss"
str_int3: Union[str, int] = None  # error

函数注解

from typing import NoReturndef f1() -> None:passdef f2() -> NoReturn:  # 无返回值passdef plus(num1: int, num2: int) -> int:return num1 + num2# 带默认值
def plus_default(num1: int, num2: int = 3) -> int:return num1 + num2# 容器的参数类型
def container_param(names: List[str]) -> None:for name in names:print(name)

类成员注解

class MyClass:attr: int# 带默认值的实例变量charge_percent: int = 100# 没有任何返回值应该注解为 Nonedef __init__(self) -> None:pass# 忽略对 self 类型的注解def my_method(self, num: int, str1: str) -> str:return num * str1# 支持自定义类型的注解
x: MyClass = MyClass()

结尾

OK, 差不多了,对之前的迭代器模式的代码改造一波

from typing import List, Iterable# 抽象迭代器类
class Iterator(object):def hasNext(self):passdef next(self):pass# 抽象聚集类
class Aggregate(object):def iterator(self):passclass BookShelf(Aggregate):def __init__(self) -> None:self._books: List[Book] = []self._last: int = 0def getBookAt(self, index: int) -> Book:return self._books[index]def appendBook(self, book: Book) -> None:self._books.append(book)self._last = self._last + 1def getLength(self) -> int:return self._lastdef iterator(self) -> BookShelfIterator:return BookShelfIterator(self)class BookShelfIterator(Iterator):def __init__(self, bookShelf) -> None:self._bookShelf: BookShelf = bookShelfself._index: int = 0def hasNext(self) -> bool:if self._index < self._bookShelf.getLength():return Trueelse:return Falsedef next(self) -> Book:book: Book = self._bookShelf.getBookAt(self._index)self._index = self._index + 1return bookclass Book():def __init__(self, name) -> None:self._name: str = namedef getName(self) -> str:return self._nameif __name__ == "__main__":bookShelf: BookShelf = BookShelf()bookShelf.appendBook(Book("A"))bookShelf.appendBook(Book("B"))bookShelf.appendBook(Book("C"))bookShelf.appendBook(Book("D"))it: Iterator = bookShelf.iterator()while it.hasNext():book: Book = it.next()print(book.getName())

emmm, 舒服了一丢丢/(ㄒoㄒ)/~~

参考

  • https://github.com/python/mypy
  • PyCon China 2019 成都分会场-刘知杭-静态类型的 Python, video🔗
  • PyCon China 2019 北京分会场-依云-类型检查拯救粗心开发者, video🔗
  • Type hints cheat sheet (Python 3)

本文由博客群发一文多发等运营工具平台 OpenWrite 发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/758649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7-7 12-24小时制

题目链接&#xff1a;7-7 12-24小时制 一. 题目 1. 题目 2. 输入输出格式 3. 输入输出样例 4. 限制 二、代码 1. 代码实现 #include <stdio.h>int main(void) {int hour, minute;char *str;if (scanf("%d:%d", &hour, &minute) ! 2) {return -1;}i…

操作系统系列学习——死锁处理

文章目录 前言死锁处理 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感谢 【哈工大】操…

如何优惠申请DigiCert证书

DigiCert作为全球知名的数字证书颁发机构&#xff0c;其SSL证书以高度的安全性和信任度广受认可。而JoySSL作为国内优秀的SSL证书服务平台&#xff0c;提供了便捷、高效的证书申请服务&#xff0c;让您能够轻松获取并安装DigiCert SSL证书。接下来&#xff0c;本文将详细介绍如…

pytest相关面试题

pytest是什么&#xff1f;它有什么优点&#xff1f; pytest是一个非常流行的Python测试框架&#xff0c;它具有简洁、易用、高校等优点。他可以帮助测试人员方便地编写和运行测试用例&#xff0c;并且提供了丰富的插件和扩展&#xff0c;支持各种测试需求介绍下pytest常用的库 …

什么情况用@RequestBody、@RequestParm、@PathVariable

1.requestParam(请求参数&#xff09;&#xff1a;使用RequestParam注释将请求参数绑定到控制器中的方法参数。用于从请求访问查询参数值的RequestParam注释。 如下请求URL&#xff1a;http://localhost:8080/springmvc/hello/101?param110&param220 以下是RequestParam注…

腾讯云服务器怎么买省钱?先领券,再下单!

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

网工内推 | 七险一金,上市公司招信息安全工程师,大牛带队

01 启明星辰信息技术集团股份有限公司 招聘岗位&#xff1a;数据安全服务工程师 职责描述&#xff1a; 1、负责数据安全服务项目的管理&#xff0c;统筹组织并协调资源落实项目交付实施; 3、负责数据安全风险评估、数据分类分级、数据安全管理制度、数据安全体系规划等数据安…

企事业单位宣传,三下乡的稿子怎么在学习强国网投稿发稿,价格多少钱?

随着学习强国成为各个企事业单位宣传的重要平台&#xff0c;如何在学习强国上发稿&#xff0c;尤其是三下乡的宣传稿件&#xff0c;成为了各位传媒工作者关注的焦点。在这里&#xff0c;我们要向大家介绍一下媒介多多网发稿平台&#xff0c;为大家提供一个便捷高效的投稿发稿渠…

C#实现俄罗斯方块代码

创建一个基本的俄罗斯方块游戏需要实现以下功能&#xff1a; 游戏区域的绘制&#xff1a;这是放置游戏方块的地方。方块的形状和旋转&#xff1a;俄罗斯方块有7种基本形状&#xff0c;每种形状都可以旋转。方块的移动&#xff1a;方块需要能够左移、右移以及下落。方块的固定&…

STM32相关资料汇总

STM32选型表 STM32手册参考网站 https://www.stmcu.org.cn/

命名空间——初识c++

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 经典的Hello Word 起航c关键字c语言的命名冲突问题域作用限定符::命名空间 namespace命名空间定义命名空间的使用1.加命名空间名称及作用域限定符2.使用…

Thingworx高可用集群部署(四)-Pgpool-II安装

主机&#xff1a;10.10.10.71、10.10.10.72、10.10.10.73 VIP: 10.10.10.101 用户&#xff1a;postgres 配置互信 passwd postgres 密码 postgres vi /etc/sudoers postgres ALL(ALL) NOPASSWD: ALL su - postgres ssh-keygen ssh-keygen -t rsa -f .ssh/id_…

【CNN轻量化】ParameterNet: Parameters Are All You Need 参数就是你所需要的

论文链接&#xff1a;http://arxiv.org/abs/2306.14525 代码链接&#xff1a;https://github.com/huawei-noah/Efficient-AI-Backbones 一、摘要 现有的低FLOPs模型&#xff08;轻量化模型&#xff09;无法从大规模预训练中受益。本文旨在增加大规模视觉预训练模型中的参数数量…

跟着cherno手搓游戏引擎【29】Batch简单合批

思路&#xff1a; CPU和GPU都开辟同样大小的一大块内存&#xff08;为了存储顶点信息&#xff09; 索引在程序运行时生成对应规则后绑定到索引缓冲中 动态生成顶点信息&#xff08;现在改成Drawquad只是确定图形顶点的位置&#xff09; 然后在Endscene&#xff0c;将CPU的动…

蓝桥杯之简单数论冲刺

文章目录 取模快速幂 取模 这道题目有两个注意点&#xff1a; 1.当你的取模之后刚好等于0的话&#xff0c;后面就不用进行后面的计算 2.if sum detail[i] > q: 这个语句的等号也很重要 import os import sys# 请在此输入您的代码a,b,n map(int,input().split())week a*5 …

从政府工作报告探计算机行业发展

政府工作报告作为政府工作的全面总结和未来规划&#xff0c;不仅反映了国家整体的发展态势&#xff0c;也为各行各业提供了发展的指引和参考。随着信息技术的快速发展&#xff0c;计算机行业已经成为推动经济社会发展的重要引擎之一。因此&#xff0c;从政府工作报告中探寻计算…

docker常用命令大全

服务相关命令​ 启动 docker 服务​ systemctl start docker 停止 docker 服务​ systemctl stop docker 重启 docker 服务​ systemctl restart docker 查看 docker 服务状态​ systemctl status docker 设置开机启动 docker 服务​ systemctl enable docker 镜像相…

初始Java篇(JavaSE基础语法)(2)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 逻辑控制 顺序结构 分支结构 if语句 switch 语句 循环结构 while 循环 for 循环 do while 循环 输入输出 输出到控制台 从键盘输入 …

详解隐私计算框架及技术要点

隐语架构一览 为什么这样分层&#xff1f; 完备性透明性开放性 隐语架构解析 产品层 算法层 隐语PSI特点 PIR Data Analysis SCQL 核心特性 联邦学习 特色 计算层 SPU 核心 HEU 同态加密设备 TEEU 密码原语 资源层 kuscia 互联互通 跨域管控 最后

ucloud、阿里云、硅云的香港服务器哪家更好?

近年香港云服务器比较受到外贸建站、企业建站人士的欢迎&#xff0c;其中Ucloud、硅云和阿里云三家的香港服务器比较火热&#xff0c;那么该三家的香港服务器有哪些特点呢&#xff1f; 1、ucloud香港服务器 优点&#xff1a;价格低廉 缺点&#xff1a;线路不稳&#xff0c;高…