当然,这与上一条好处有关——我们用 Mypy 找出的大多数 bug 都是在重构时发现的。第三点的价值怎么强调都不为过。毫不夸张地说,在 Mypy 的帮助下,我发布更改的速度快了十倍,甚至快了一百倍。...虽然这是完全主观的,但在写这篇文章时,我意识到:我信任 Mypy。虽然程度还不及,比如说 OCaml 编译器,但它完全改变了我维护 Python 代码的关系,我无法想象回到没有注解的世界。...痛点Zulip 的帖子同样强调了他们在迁移 Mypy 时所经历的痛点(与静态代码分析工具的交互,循环导入)。坦率地说,我在 Mypy 上经历的痛点与 Zulip 文章中提到的不一样。...(顺便说一下:Python 3.10 使用ParamSpec 对装饰器的情况作了重大的改进。)提示与技巧最后,我要介绍几个在使用 Mypy 时很有用的技巧。...GitHub 上的问题当搜索如何解决某个类型问题时,我经常会找到 Mypy 的 GitHub Issues (比 Stack Overflow 还多)。
, 2, 3])) 为了提供一个解决方法,Mypy 插件具有一个额外的功能,我们可以指定一个额外的属性 _mypy_mapped_attrs,它是一个包含类级对象或它们的字符串名称的列表。...返回: 如果无法完成强制转换,则该方法应返回强制转换后的值,或引发ValueError。...返回: 如果无法完成转换,则该方法应返回转换后的值,或引发ValueError。...返回: 如果无法完成强制转换,该方法应返回强制转换后的值,或引发ValueError。...返回: 如果无法完成强制转换,则该方法应返回强制转换后的值,或引发 ValueError。
警告 Optional不是一个很好的名称,因为该注释并不使参数变为可选的。使其可选的是为参数分配默认值。Optional[str]只是表示:该参数的类型可以是str或NoneType。...在这些情况下,返回类型由输入类型确定,因此Union不是一个准确的解决方案。...更重要的是,如果我用 Mypy 检查该测试文件,我会看到 TypeVar 正如预期的那样工作。查看 示例 8-23 中的 mypy 命令输出。...例如,我没有使用 typing.Iterator,而是使用了 abc.Iterator。请忽略这个细节。Mypy 的输出仍然有用。在讨论输出时,我会假装 Mypy 的这个问题已经解决。...示例 8-21 展示了为什么这个特性被称为静态鸭子类型:注释top的series参数的解决方案是说“series的名义类型并不重要,只要它实现了__lt__方法。”
1、类型提示仅在语法层面有效 类型提示(自 PEP 3107 开始引入)用于向变量、参数、函数参数以及它们的返回值、类属性和方法添加类型。...install mypy 安装一下,然后 mypy script.py 即可: 更多 mypy 相关可以参考前文mypy 这个工具,让Python的类型提示变得非常实用。..., str] my_dict: my_dict_type = {"name": "Somenzz", "job": "engineer"} 6、TypedDict 用法 假如你需要提示这样的类型,那该怎么办...用法 当你传入的参数可以为任何类型的时候,就可以使用 Any def bar(input: Any): ... 10、Optional 用法 如果你的函数使用可选参数,具有默认值,那么你可以使用类型模块中的...Optional 类型。
(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 接下来我们会重写上面的扑克牌游戏
Gradual typing Types 和 Classes 各种使用场景 基本类型 容器类型 类型别名 函数类型 “泛” 型 Any TypeVar 函数的“泛”型 Union 和 Optional...“静态” 一些,将会给我们带来几个明显的增益: 大幅度提升代码的可读性 能够将参数传递时的 类型错误 扼杀在摇(biān)篮(mǎ)中 能够最大程度利用 IDE 提供的代码提示,减少 typo 那么该如何拥有这些...其中 [Arg1Type, Arg2Type] 是输入参数列表,ReturnType 是返回内容。...有时候我们对于某些“泛”型变量,我们可以用 Any 来表明 from typing import TypeVar, AnyStr, Any # 任意类型 # Any 兼容任意类型 def concat...(a: Any, b: Any) -> Any: pass TypeVar TypeVar 表示 Type 类型。
我以为我能在几天内完成这项任务。到了第三周,我还是坚信自己可以在几天内完成。每天,解决方案似乎就在眼前,在第五周,我有了一个工作原型。...专业注释 在我的第一份软件工作中,一位我非常尊敬的资深同事把我拉到一边,解释说因为我们有时会向客户发布产品的源代码,所以注释保持专业的语气是很重要的。...更好的方法是,不使用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类型提示,您将失去静态类型检查的好处。
它关心的是对它调用的加法方法返回的内容是否是合理的,如果不是,就会抛出异常。 所以这意味着什么呢?...我将称它们为带类型提示。在其他语言中,注释和提示的意义完全不同。 在 Python 2 中人们开始在代码中加入提示,来表示各种函数返回了什么。...还有一种叫 Optional 和 Union 的类型。...这取决于你的使用场景,就像 Guido 和 mypy 文档里说的: mypy 的目标不是说服每个人都编写静态类型的 Python,不管是现在还是将来,静态类型的编程完全是可选的。...由于设置 mypy 和思考所需要的类型的开销,类型提示对于小型代码库来说没有意义(比如在 jupyter notebook 中)。什么算小代码库呢? 保守的说,大概是任何低于 1k 的内容。
本文主要介绍Python中类型标注的作用,以及最常用的类型标注应该怎么写。...能帮我们解决一些由类型导致的逻辑问题,不用运行代码时就能够对代码进行分析。 静态分析工具mypy 不用运行代码时就能够对代码进行分析的工具,我们称为静态分析工具,这里介绍的是mypy。...": true, 修改完之后再返回代码编辑,可以发现直接在编辑过程中就能显示错误了: 自定义数据类型的类型标注 Python的内置数据类型都是可以拿来做类型标注的,例入int、float、list等等...允许多种数据类型的标注 在很多情况下,我们允许一个参数传入int/None多种数据类型,那么可以这样表示: 而在Python3.10之后也可以简写为: 由于参数允许None是很常见的,所以Python也提供了Optional...,默认是包含None类型的,这样写起来更简洁: 也就是说,以上这3种写法都是等价的(注意第二种写法仅在Python3.10之后支持)。
另外也有一些库是支持类型检查的,比如 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
你说的类型检查的问题: 可以通过提升程序员的素质来解决这个问题,或者让他们长点脑子,别特么在这种低级错误上犯错误。...这可不仅仅能解决类型不正确带来的问题,还能快速解决代码的逻辑问题 Java: 关于你说的第三点,我完全可以提升测试代码的覆盖率。哎?似乎我这个开发测试成本也上来了。...看来类型检查也不能解决这个问题 Javaer: 来 P 哥 静态类型确实以较低的成本解决了这种类型的问题,不是么? 并且,如果我其中一小块功能进行了修改,我总不能每次都跑 IPython 吧?...Python 创始人的头发 Javaer: 我不是那个意思,浓缩就是精华嘛,但我表达能力弱又怎么样,我 Javaer 可以直接封装好这个功能当成工具类用,从外部使用上用起来差不多好吧,从项目角度表达力并不是决定性因素...Pythonist: 我自己打脸一下,动态类型花点时间写 type annotation 代码健壮性杠杠的。 Javaer: 你走开… 你怎么不去解决 GIL 的问题。
在研究 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。
必须找到避免这类问题的解决方式,为编写代码提供便利。 在本篇文章中我将详细介绍常用的工具与技巧,希望能给大家提供帮助。 1 Python开发环境 解释器: 从使用Python最重要的解释器开始。...但如果你的程序需要不同版本的Python,或依赖于同一第三方模块的不同版本,并需要在几个程序之间无缝切换时该怎么办? Pyenv可以解决上述问题。...我最常使用的工具是Poetry。 Poetry可以帮助你简单地完成如下工作。...终于完成了使用poetry创建项目的所有准备工作,我把这个项目命名为dsexample,为了展示如何使用poetry,我添加了一个特定版本的pandas库,以及所有额外需求的fastapi框架。...我倾向于后者,因为precommit只在本地使用,而不在CI/CD服务器上。 相反,black和mypy在CI/CD服务器上运行,因此,将它们添加到项目的dev依赖项是有意义的。
比如在UI的自动化测试中,我们更加关注的是对页面的操作,而不是关心打开浏览器和关闭浏览器,在数据库的操作中,更加关注的是对MySQL的基本操作,而不怎么关心连接数据库和数据库断开连接这部分。...在pytest的测试框架中,测试固件有各种形式的表现,比如除了刚才说的初始化与清理外,还有它强大的参数化的部分。下面还是通过具体的案例来说明这部分的应用。...首先来看fixture的函数返回值,也就是返回数值。先看如下的案例代码: #!...继续来解释装饰器@pytest.fixture(),它是声明一个函数是fixture,如果测试函数的参数列表中包含了fixture名,那么pytest执行的时候,就会检测到,并且在测试函数运行之前执行该fixture...,fixture可以完成任务,也可以返回数据给测试函数。
必须找到避免这类问题的解决方式,为编写代码提供便利。 在本篇文章中我将详细介绍常用的工具与技巧,希望能为读者提供帮助。 Python开发环境 解释器 从使用Python时最重要的解释器开始。...但如果你的程序需要不同版本的Python,或依赖于同一第三方模块的不同版本,并需要在几个程序之间无缝切换时该怎么办? Pyenv可以解决上述问题。...我把这个项目命名为dsexample,我知道这个名字很蠢,但我不想浪费时间去想一个更好的。为了展示如何使用poetry,我添加了一个特定版本的pandas库,以及所有额外需求的fastapi框架。...但用Black可以解决上述问题! Black是一种让程序员在编写python代码时能将精力集中于核心内容的工具。它自动为代码添加格式,避免程序员手动添加格式。...下面介绍mypy。 Mypy是一种静态python代码检查器,作用是在错误发生之前找到他们。使用poetry向项目中添加mypy并进行代码检查与添加black一样简单。
我不知道没有他们我该如何生活 我编写Python已有5年以上了,我的工具集通常变得越来越小,而不是越来越大。 许多工具不是必需的或无用的,而其中的一些只是简单地增加了。...结果 我使用风筝已有多年了,而且一直在不断进步。 凭借超过1700万美元的投资,这家公司无处不在,而且由于某些愚蠢的原因,该工具是完全免费的。...def iter_primes() - Iterator[int]: # code here 在mypy示例中,我们指定该函数返回一个整数迭代器。...通过执行一致的输出,此简单的更改使该功能更适应未来的需求。 其他开发人员只需查看声明即可查看输出将是哪种数据类型,并且与仅使用文档不同,如果不遵守该声明,您的代码将出错。...结果 我发现这比基本的阻止和掉毛实践有用,而且我相信这使我编写了对人类友好的代码。 顺便说一句,这是Pythonic! SonarLint是免费的,因此没有理由不立即获取它并将其附加到您的编辑器中。
at com.cmower.dzone.stopdoing3things.NullDemo.main(NullDemo.java:12) 那假如小二在遍历的时候不想判空又不想代码抛出 NPE 错误,他该怎么做呢...除了我这个想法之外,你还能想到其他的解决方案吗?...我来负责任地介绍一下,你们握个手。 假如数据库中存在姓名,则使用 Optional.of() 对返回值进行包装,从而返回一个 Optional 类型的对象。...怎么此刻我的脑子里想起了安徒生先生的寓言故事——皇帝的新衣,嗯,甭管了,反正“底层终究是丑陋的”。...但不管怎么说,终于可以在表象上和 null,NPE 说拜拜了,做人嘛,开心点。 ?
领取专属 10元无门槛券
手把手带您无忧上云