首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用 Mypy 检查 30 万行 Python 代码,总结出 3 大痛点与 6 个技巧!

当然,这与上一条好处有关——我们用 Mypy 找出的大多数 bug 都是在重构时发现的。第三点的价值怎么强调都不为过。毫不夸张地,在 Mypy 的帮助下,发布更改的速度快了十倍,甚至快了一百倍。...虽然这是完全主观的,但在写这篇文章时,意识到:信任 Mypy。虽然程度还不及,比如 OCaml 编译器,但它完全改变了维护 Python 代码的关系,无法想象回到没有注解的世界。...痛点Zulip 的帖子同样强调了他们在迁移 Mypy 时所经历的痛点(与静态代码分析工具的交互,循环导入)。坦率地Mypy 上经历的痛点与 Zulip 文章中提到的不一样。...(顺便一下:Python 3.10 使用ParamSpec 对装饰器的情况作了重大的改进。)提示与技巧最后,要介绍几个在使用 Mypy 时很有用的技巧。...GitHub 上的问题当搜索如何解决某个类型问题时,经常会找到 Mypy 的 GitHub Issues (比 Stack Overflow 还多)。

89420
您找到你想要的搜索结果了吗?
是的
没有找到

流畅的 Python 第二版(GPT 重译)(四)

警告 Optional不是一个很好的名称,因为注释并不使参数变为可选的。使其可选的是为参数分配默认值。Optional[str]只是表示:参数的类型可以是str或NoneType。...在这些情况下,返回类型由输入类型确定,因此Union不是一个准确的解决方案。...更重要的是,如果Mypy 检查测试文件,我会看到 TypeVar 正如预期的那样工作。查看 示例 8-23 中的 mypy 命令输出。...例如,没有使用 typing.Iterator,而是使用了 abc.Iterator。请忽略这个细节。Mypy 的输出仍然有用。在讨论输出时,我会假装 Mypy 的这个问题已经解决。...示例 8-21 展示了为什么这个特性被称为静态鸭子类型:注释top的series参数的解决方案是“series的名义类型并不重要,只要它实现了__lt__方法。”

32610

python类型检测最终指南--Typing的使用

(names) name = choose(names) reveal_type(name) 虽然Mypy会正确推断名称是字符串列表,但由于使用了任意类型,在调用choose ( )后,信息会丢失...error: Revealed type is 'Any' 由此可以得知,如果使用了Any使用mypy的时候将不容易检测。...所以在第三个例子中,choose()的返回值保证可以被认为是浮点数。在最后一个例子中,str和int之间没有子类型关系,因此关于返回值可以最好的是它是一个对象。 请注意,这些示例都没有引发类型错误。...为解决上面的问题,这里可以使用Optional类型: from typing import Sequence, Optional def player_order( names: Sequence...如果你不想 Mypy 出现报错,你可以使用命令 --no-implicit-optional Example: The Object(ive) of the Game 接下来我们会重写上面的扑克牌游戏

4.7K10

Python 进阶指南(编程轻松进阶):十一、注释、文档字符串和类型提示

以为能在几天内完成这项任务。到了第三周,还是坚信自己可以在几天内完成。每天,解决方案似乎就在眼前,在第五周,有了一个工作原型。...专业注释 在的第一份软件工作中,一位非常尊敬的资深同事把拉到一边,解释因为我们有时会向客户发布产品的源代码,所以注释保持专业的语气是很重要的。...更好的方法是,不使用Union[str, None],而是从typing模块导入Optional并使用Optional[str]。这种类型提示意味着函数或方法可能返回None,而不是预期类型的值。...您可以使用Any类型提示(也来自typing模块)来指定变量、参数或返回值可以是任何数据类型: from typing import Any import datetime spam: Any = 42...但是Any是比object更容易理解的类型提示。 正如你应该用Union和Optional一样,尽量少用Any。如果您将所有的变量、参数和返回值都设置为Any类型提示,您将失去静态类型检查的好处。

91930

深入理解 Python 的类型提示

它关心的是对它调用的加法方法返回的内容是否是合理的,如果不是,就会抛出异常。 所以这意味着什么呢?...将称它们为带类型提示。在其他语言中,注释和提示的意义完全不同。 在 Python 2 中人们开始在代码中加入提示,来表示各种函数返回了什么。...还有一种叫 Optional 和 Union 的类型。...这取决于你的使用场景,就像 Guido 和 mypy 文档里的: mypy 的目标不是说服每个人都编写静态类型的 Python,不管是现在还是将来,静态类型的编程完全是可选的。...由于设置 mypy 和思考所需要的类型的开销,类型提示对于小型代码库来说没有意义(比如在 jupyter notebook 中)。什么算小代码库呢? 保守的,大概是任何低于 1k 的内容。

1.1K30

Python类型标注入门与初探

本文主要介绍Python中类型标注的作用,以及最常用的类型标注应该怎么写。...能帮我们解决一些由类型导致的逻辑问题,不用运行代码时就能够对代码进行分析。 静态分析工具mypy 不用运行代码时就能够对代码进行分析的工具,我们称为静态分析工具,这里介绍的是mypy。...": true, 修改完之后再返回代码编辑,可以发现直接在编辑过程中就能显示错误了: 自定义数据类型的类型标注 Python的内置数据类型都是可以拿来做类型标注的,例入int、float、list等等...允许多种数据类型的标注 在很多情况下,我们允许一个参数传入int/None多种数据类型,那么可以这样表示: 而在Python3.10之后也可以简写为: 由于参数允许None是很常见的,所以Python也提供了Optional...,默认是包含None类型的,这样写起来更简洁: 也就是,以上这3种写法都是等价的(注意第二种写法仅在Python3.10之后支持)。

61830

Python高手必修课:如何让 Python 代码更易读,推荐收藏

另外也有一些库是支持类型检查的,比如 mypy,安装之后,利用 mypy 即可检查出 Python 脚本中不符合类型注解的调用情况。...,为了注解它的返回类型,我们可以将其注解为 NoReturn,例如: def hello() -> NoReturn: print('hello') Any Any,是一种特殊的类型,它可以代表所有类型...,静态类型检查器的所有类型都与 Any 类型兼容,所有的无参数类型注解和返回类型注解的都会默认使用 Any 类型,也就是,下面两个方法的声明是完全等价的: def add(a): return...Optional Optional,意思是这个参数可以为空或已经声明的类型,即 Optional[X] 等价于 Union[X, None]。...如当一个方法执行结果,如果执行完毕就不返回错误信息, 如果发生问题就返回错误信息,则可以这么声明: def judge(result: bool) -> Optional[str]: if result

78610

使用类型注解让 Python 代码更易读

另外也有一些库是支持类型检查的,比如 mypy,安装之后,利用 mypy 即可检查出 Python 脚本中不符合类型注解的调用情况。...,为了注解它的返回类型,我们可以将其注解为 NoReturn,例如: def hello() -> NoReturn: print('hello') Any Any,是一种特殊的类型,它可以代表所有类型...,静态类型检查器的所有类型都与 Any 类型兼容,所有的无参数类型注解和返回类型注解的都会默认使用 Any 类型,也就是,下面两个方法的声明是完全等价的: def add(a): return...Optional Optional,意思是这个参数可以为空或已经声明的类型,即 Optional[X] 等价于 Union[X, None]。...如当一个方法执行结果,如果执行完毕就不返回错误信息, 如果发生问题就返回错误信息,则可以这么声明: def judge(result: bool) -> Optional[str]: if result

82330

使用类型注解让 Python 代码更易读

另外也有一些库是支持类型检查的,比如 mypy,安装之后,利用 mypy 即可检查出 Python 脚本中不符合类型注解的调用情况。...,为了注解它的返回类型,我们可以将其注解为 NoReturn,例如: def hello() -> NoReturn: print('hello') Any Any,是一种特殊的类型,它可以代表所有类型...,静态类型检查器的所有类型都与 Any 类型兼容,所有的无参数类型注解和返回类型注解的都会默认使用 Any 类型,也就是,下面两个方法的声明是完全等价的: def add(a): return...Optional Optional,意思是这个参数可以为空或已经声明的类型,即 Optional[X] 等价于 Union[X, None]。...如当一个方法执行结果,如果执行完毕就不返回错误信息, 如果发生问题就返回错误信息,则可以这么声明: def judge(result: bool) -> Optional[str]: if result

2.1K50

用 Type Annotation 提升 Python 代码健壮性

的类型检查的问题: 可以通过提升程序员的素质来解决这个问题,或者让他们长点脑子,别特么在这种低级错误上犯错误。...这可不仅仅能解决类型不正确带来的问题,还能快速解决代码的逻辑问题 Java: 关于你的第三点,完全可以提升测试代码的覆盖率。哎?似乎这个开发测试成本也上来了。...看来类型检查也不能解决这个问题 Javaer: 来 P 哥 静态类型确实以较低的成本解决了这种类型的问题,不是么? 并且,如果其中一小块功能进行了修改,总不能每次都跑 IPython 吧?...Python 创始人的头发 Javaer: 不是那个意思,浓缩就是精华嘛,但我表达能力弱又怎么样, Javaer 可以直接封装好这个功能当成工具类用,从外部使用上用起来差不多好吧,从项目角度表达力并不是决定性因素...Pythonist: 自己打脸一下,动态类型花点时间写 type annotation 代码健壮性杠杠的。 Javaer: 你走开… 你怎么不去解决 GIL 的问题。

1.5K20

流畅的 Python 第二版(GPT 重译)(八)

在研究 typeshed 时,发现了 bug 报告 #4051:Mypy 没有警告将 None 作为内置 max() 函数的参数之一是非法的,或者传递一个在某个时刻产生 None 的可迭代对象也是非法的...⁶ ② 可以返回whatever—类型为Any—因为Any与每种类型都一致,包括声明的返回类型BookDict。...如果你使用--disallow-any-expr运行 Mypy,它会抱怨from_json函数体中的两行代码: …/typeddict/ $ mypy books_any.py --disallow-any-expr...编写了这行代码: addr = server.sockets[0].getsockname() 但 Mypy 报告了这个错误: Value of type "Optional[List[socket]...类似地,我们可以编写RandomPicker协议的通用版本,协议在示例 13-18 中介绍,协议定义了一个返回Any的单个方法pick。

16710

神级操作!优化​Python开发环境的几个技巧

必须找到避免这类问题的解决方式,为编写代码提供便利。 在本篇文章中将详细介绍常用的工具与技巧,希望能给大家提供帮助。 1 Python开发环境 解释器: 从使用Python最重要的解释器开始。...但如果你的程序需要不同版本的Python,或依赖于同一第三方模块的不同版本,并需要在几个程序之间无缝切换时怎么办? Pyenv可以解决上述问题。...最常使用的工具是Poetry。 Poetry可以帮助你简单地完成如下工作。...终于完成了使用poetry创建项目的所有准备工作,把这个项目命名为dsexample,为了展示如何使用poetry,添加了一个特定版本的pandas库,以及所有额外需求的fastapi框架。...倾向于后者,因为precommit只在本地使用,而不在CI/CD服务器上。 相反,black和mypy在CI/CD服务器上运行,因此,将它们添加到项目的dev依赖项是有意义的。

1.1K10

Pytest框架之fixture(三)

比如在UI的自动化测试中,我们更加关注的是对页面的操作,而不是关心打开浏览器和关闭浏览器,在数据库的操作中,更加关注的是对MySQL的基本操作,而不怎么关心连接数据库和数据库断开连接这部分。...在pytest的测试框架中,测试固件有各种形式的表现,比如除了刚才的初始化与清理外,还有它强大的参数化的部分。下面还是通过具体的案例来说明这部分的应用。...首先来看fixture的函数返回值,也就是返回数值。先看如下的案例代码: #!...继续来解释装饰器@pytest.fixture(),它是声明一个函数是fixture,如果测试函数的参数列表中包含了fixture名,那么pytest执行的时候,就会检测到,并且在测试函数运行之前执行fixture...,fixture可以完成任务,也可以返回数据给测试函数。

57010

自动化让你远离烦恼,几个小技巧轻松优化​Python开发环境

必须找到避免这类问题的解决方式,为编写代码提供便利。 在本篇文章中将详细介绍常用的工具与技巧,希望能为读者提供帮助。 Python开发环境 解释器 从使用Python时最重要的解释器开始。...但如果你的程序需要不同版本的Python,或依赖于同一第三方模块的不同版本,并需要在几个程序之间无缝切换时怎么办? Pyenv可以解决上述问题。...把这个项目命名为dsexample,知道这个名字很蠢,但我不想浪费时间去想一个更好的。为了展示如何使用poetry,添加了一个特定版本的pandas库,以及所有额外需求的fastapi框架。...但用Black可以解决上述问题! Black是一种让程序员在编写python代码时能将精力集中于核心内容的工具。它自动为代码添加格式,避免程序员手动添加格式。...下面介绍mypyMypy是一种静态python代码检查器,作用是在错误发生之前找到他们。使用poetry向项目中添加mypy并进行代码检查与添加black一样简单。

1.2K30

3种适用于Python的疯狂秘密武器及原因解析

不知道没有他们如何生活 编写Python已有5年以上了,的工具集通常变得越来越小,而不是越来越大。 许多工具不是必需的或无用的,而其中的一些只是简单地增加了。...结果 使用风筝已有多年了,而且一直在不断进步。 凭借超过1700万美元的投资,这家公司无处不在,而且由于某些愚蠢的原因,工具是完全免费的。...def iter_primes() - Iterator[int]: # code here 在mypy示例中,我们指定该函数返回一个整数迭代器。...通过执行一致的输出,此简单的更改使功能更适应未来的需求。 其他开发人员只需查看声明即可查看输出将是哪种数据类型,并且与仅使用文档不同,如果不遵守声明,您的代码将出错。...结果 发现这比基本的阻止和掉毛实践有用,而且相信这使编写了对人类友好的代码。 顺便一句,这是Pythonic! SonarLint是免费的,因此没有理由不立即获取它并将其附加到您的编辑器中。

89530

Pytest框架之fixture(三)

比如在UI的自动化测试中,我们更加关注的是对页面的操作,而不是关心打开浏览器和关闭浏览器,在数据库的操作中,更加关注的是对MySQL的基本操作,而不怎么关心连接数据库和数据库断开连接这部分。...在pytest的测试框架中,测试固件有各种形式的表现,比如除了刚才的初始化与清理外,还有它强大的参数化的部分。下面还是通过具体的案例来说明这部分的应用。...首先来看fixture的函数返回值,也就是返回数值。先看如下的案例代码: #!...继续来解释装饰器@pytest.fixture(),它是声明一个函数是fixture,如果测试函数的参数列表中包含了fixture名,那么pytest执行的时候,就会检测到,并且在测试函数运行之前执行fixture...,fixture可以完成任务,也可以返回数据给测试函数。

1.3K21
领券