探索 Python 库:Mypy
介绍
Mypy是一个与 Python 3.5+ 兼容的开源类型检查器。它由 Dropbox 团队维护,最常用于静态类型检查代码。
在本指南中,您将探索令人兴奋的新 Python 库 Mypy。您还将学习如何在 Python 3.5+ 中注释代码,并熟悉 Mypy 的鸭子类型兼容性。
Mypy 是什么?
Mypy 是用于在您想要在 Python 中静态输入代码时检查类型注释的 Python 库。它可作为 Python 的可选静态类型检查器。使用 Mypy,您可以结合 Python 中动态和静态编程的优点。您基本上可以在不运行实际代码的情况下进行类型检查,因为 Mypy 没有运行时开销。
您可能仍然想知道静态类型代码的好处。让我们来看看静态类型或类型提示的一些好处。
静态类型的好处
在编写需要维护多年的生产代码时,静态类型起着非常重要的作用。静态类型的一些好处包括:
一旦您获得了代码的类型信息,理解和使用代码就会变得更加容易。
如果你能完全理解代码,那么维护代码就会变得容易得多。
它使代码调试更容易,因为您始终知道每个函数的输入和输出类型。
无需实际运行代码,您就知道代码中的对象在何处以及如何使用。
在静态类型下代码看起来更加干净,代码或程序的打包问题也得到了解决。
安装
假设您的系统上安装了 Python 和 pip,则安装 Mypy 不需要任何依赖项。
使用 pip
要使用pip安装,请打开终端并运行以下命令:
pip install mypy
使用 conda
要使用conda安装,请打开终端并运行以下命令:
conda install -c conda-forge/label/cf201901 mypy
使用 Python 进行类型注释
当您在 Mypy 上运行没有任何注释的代码时,它不会引发错误,因为您必须教 Mypy 使用代码中的类型注释来检测错误。
我们来看一个带有类型注释的简单代码。
# wo_annotation.py
def adding_numbers(a ,b):
return a+b
print(adding_numbers(4,5))
使用 Python 运行上述代码:
$ python w_annotation.py
> 9
如果使用类型注释进行转换,它将看起来像这样:
# w_annotation.py
def adding_numbers(a: int, b: int) -> int:
return a+b
print(adding_numbers('4','5'))
在上面的代码中,您正在教 Mypy,adding_numbers函数可以接受并返回一个整数。
现在让我们运行这段代码。
$ python w_annotation.py
> 45
如您所见,即使在代码中输入注释,也不会出现错误,因为解释器会忽略这些类型注释。
要使用 Mypy 运行代码,只需使用 Mypy 的解释器运行.py扩展文件。
mypy name_of_file.py
现在让我们用 Mypy 运行相同的代码。
# annotating our fucntion with int type.
def adding_numbers(a : int, b: int) -> int:
return a+b
print(adding_numbers('4','5'))
# annotating our fucntion with str type.
def adding_numbers(a : str, b: str) -> str:
return a+b
print(adding_numbers(0.1,2))
在这里,您无需在代码上设置任何类型的测试工具,也无需编写任何测试来执行此代码,即可发现错误。您只需在代码上运行测试分析器 (Mypy) 即可发现错误。
因此,Mypy 要求我们注释我们的函数签名以验证我们对输入和输出类型的假设。
名义类型
用于类型检查的名义类型有很多。这里我仅解释最常用的那些。
内置 Python 类型(int、float、type、object 等)
通用容器。以下是几个示例:
元组类型
t : Tuple(int, float) = 0, 1,1.2
Dict type
d : dict(str, int) = {'a' : 1, 'b' : 2} d : mutablemappingstr[ str, int ] = {'a':1, 'b' : 20}
List Type
l : List[int] = [1,2,3]
Iterable type
i : Iterable[Text] = [u '1'. u '2', u '3']
Alias Types
vector = list[float]
Distinct Types
UserId = NewType('UserId', int)
some_id = UserId(524313)
鸭子类型兼容性
有时,即使 Python 中的某些类型不是彼此的子类,它们也是兼容的。例如,当需要float对象时, int对象是有效的。Mypy 通过 duck 类型兼容性支持这一点,该兼容性仅支持一小部分内置类型。
- float是与复杂类型兼容的 duck 类型
- int是与 float 和 complex 兼容的 duck 类型
- 在 Python 2 中,str是与 Unicode 兼容的 duck 类型。
# importing math library
import math
# annotate the fucntion which we have defined
def degrees_to_radians(degrees: float) -> float:
return math.pi * degrees / 180
n = 90
print(degrees_to_radians(n))
此代码使用float类型注释输入,并以int形式提供输入。不过,Mypy 并未抛出类型错误。
结论
在本指南中,我们了解了 Mypy 的基础知识以及如何用 Python 编写静态代码。我们描述了静态类型的好处以及它在编写将维护多年的生产代码时为何如此重要。我们还学习了如何在 Python 3.5+ 中注释代码以及如何使用 Mypy 检查注释的代码。最后,我们还了解了 Mypy 的鸭子类型兼容性。
我希望通过本指南,您能够了解 Mypy 和 Python 类型检查的基础知识,并有动力更深入地使用这个出色的类型检查工具。有关更多信息,您可以随时查看Mypy 文档。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~