datetime类型怎么输入_为忙碌的Python程序员提供类型提示

4cb03074cd37e32de8801e48c27599cd.png

“好的,我知道有类型注释或类型提示之类的什么东西。

是的,“类型注释”和“类型提示”是同一个意思。

“好的。我知道它们是什么:它们允许您为变量、函数参数以及返回值指定数据类型,这使您能够及早捕获某些类型的bug,并避免大量调试和麻烦。我准备好了。我该如何使用它们呢?”

有两个部分。第一部分是向源代码添加类型提示。这涉及到作为3.5版本的Python标准库的一部分的typing模块。第二部分是您安装mypy模块来执行实际的检查。

“等等,为什么有两个模块? 这听起来很复杂。

第一个模块——typing——允许您指定不同的数据类型。但是Python解释器并不关心它们是否正确。变量的实际值不必与变量的类型相匹配;代码仍然可以运行的很好。

“实际值不必与变量类型一致?那还有什么用?

还是有用的,不过请记住在Python中类型提示是可选的。如果您正在编写一个快速脚本,并且不关心它,那么您不必使用类型提示。Python解释器本身会完全忽略类型提示。在运行时不会进行类型检查。因此,从技术上讲,类型提示不是“可选的静态类型”,因为“静态类型”意味着变量总是会存储特定类型的值。即使有类型提示,Python仍然是一种动态类型化语言。类型提示只是像Mypy这样的第三方工具可以用来指出潜在bug的提示而已。

第二个模块是mypy,它实际上是一个检查源代码是否有效以及所有类型是否匹配的工具。Mypy是由第三方开发的,这就是我们使用两个独立模块的原因。您不需要使用Mypy。您可以使用任何第三方模块来做Mypy所做的检查。

“那么我可以用什么来代替Mypy呢?”

有来自Microsoft的Pyright,来自Facebook的Pyre和来自Google的Pytype。它们都是免费的,功能也一样,但是大多数人似乎会使用Mypy。

“既然Python 3.5及以后版本中才加入了typing。那我要如何安装Mypy?”

运行python -m pip install mypy(在macOS和Linux上使用python3)。如果您得到关于权限的错误消息时请添加--user:  python -m pip install --user mypy。

如果Python解释器不关心类型提示,那么我该如何检查我的源代码是否与声明的类型相匹配?

当您安装Mypy时,Mypy将在Python的Scripts文件夹中安装一个命令行工具。因此,当您从命令行(不是从Python交互式shell)运行mypy yourProgram.py时,如果您的代码是有效的,它不会输出任何东西。如果不是,它将显示错误。我通常使用python -m mypy yourProgram.py的运行方式。

但是更简单的方法是为您使用的编辑器或IDE获取一个插件。通过这种方式,编辑器就可以在您键入代码时在后台运行Mypy,并几乎会立即显示您所犯的任何错误。例如,对于Sublime Text来说,您只需要使用Package Control安装SublimeLinter 和 SublimeLinter-contrib-mypy。然后,当您在Sublime Text中输入Python代码时,它会自动显示Mypy发现的任何错误。

“当您说Python中的类型提示是可选的的时候,您是说我的一半变量可以使用类型提示,另一半不需要吗?”

是的。Python称之为渐进类型化。如果您想要向您的Python代码中添加类型提示,您不需要一次完成所有的工作。这就像单元测试的覆盖率一样:您可以只测试一些函数。

“好的,我将安装Mypy并设置我的编辑器来使用它。已经完成。那么,我在代码中编写类型提示时所使用的所有类型是哪些呢?”

Mypy站点有一个很好的备忘表。基本上,您可以使用与类型转换函数相同的名称,如int()、str()等。那是因为它们从技术上来说是整数和字符串的类名。就像您调用datetime.date(2025, 10, 31)创建date类的一个对象,调用int("42")创建int类的一个整数对象一样。在Python中,“类”、“类型”和“数据类型”是完全相同的东西。

“好吧。那么我该如何在代码中编写类型提示呢?”

在变量名之后添加一个分号和类型名即可。这里是一个例子,其中每一个类型注释都有注释解释:

bb9ed959135dfc311478d210c92340e3.png

“酷。那么,当我编写了代码将一个变量设置为错误类型的值时,会发生什么情况呢?”

在Python中,什么都不会发生。当您运行Python解释器来运行程序时,它并不关心类型提示。它只是将变量设置为特定的值。但是,在此之前,当您在一个后台运行Mypy的编辑器中编写源代码时,Mypy会报告编辑器有问题存在,并且编辑器会在您输入时显示它。

9b477399af9e723cfa3a408f3f799c6a.png

那么列表、元组、字典和其他容器类型中的值呢?我可以为它们定义类型提示吗?”

是的,您可以通过添加方括号并将项目类型包括在里边来完成。但是,cats: list[str] = ['Zophie', 'Pooka']不是有效的Python代码。(这种风格行不通的原因在这里已经说得太多了。)Python核心开发人员提出的解决方案是在typing模块中添加类似的类。这里有一个例子:

7b16bb51dd9ab6acc5fde1ce26321c82.png

“如果我想要一个包含多种类型值的列表呢?”

那就使用typing模块中的Union类型。例如:

36becb7e98d11aa89349d26cc7a5ede9.png

您也可以使用Union来定义可以有多个类型的变量:

c1e6e33935b378fcc3525af0468beba5.png

“好吧。那么如果我有一个包含整数的变量,但也可以包含None,嗯......那我应该使用Union[int, NoneType]吗?

您可以使用Optional来代替,它的意思是一样的。从技术上讲,NoneType不像int或str那样是一个定义好的类型。所以您不能像说type(42) == int那样说 type(None) == NoneType。相反,我们只需要像在这个例子中一样使用None即可:

92ab3a2e861490bdd83a8eb27ac16d20.png

>>> 今日签到口令:10h5 <<<

但问题是:您应该避免使用像None这样的“null”值。计算机科学家和空值的发明者Tony Hoare称此为他数十亿美元的错误,因为这经常是错误的原因。我模糊地记得一些研究指出,NullReferenceException本身是导致大约30%的Java应用程序崩溃的原因。Kotlin,一种现代化的Java语言,默认情况下不允许您将变量设置为null。如果需要的话,您仍然可以使用None,但是不要没有经过深思熟虑就使用它。

“如果我不关心变量的值的类型会怎样。我不应该使用类型提示吗?”

不,请记住“明确优于隐晦”。您应该明确地为变量使用Any类型,它可以是任何类型:

a064f647e02743f61ae58406c4e11838.png

我可以执行更具体的检查吗?比如,指定一个变量应该是整数,而不是负整数?

不行。类型提示仅用于类型,而不用于值。我已经建议子类化这个类,或者,因为您不能子类化int,您可以创建您自己的非负整数类。无论如何,请记住类型提示只在运行时之前有效。它们不执行值的运行时检查。您应该使用assert或者甚至只使用if语句来实现这一点。

我写的类或者其他类型(比如datetime.date),或者从re.search('[aeiou]', 'hello')返回的匹配对象,又是怎样的呢?

您只需使用类名作为类型。请记住,在Python中,术语类型、数据类型和类都有相同的含义。还要注意self是不带有类型提示的:

713a484c7c00c20bcf75dfae0f9a45e9.png

“那么像函数、序列、映射或迭代这些奇怪的类型又是怎样呢?”

typing模块有Callable、Sequence、 Mapping、Iterable和其他类型等等。您可以在文档中找到它们。

“好的,很酷。那么函数呢?我该如何为参数和返回值编写类型提示呢?”

这些都是在def语句中完成的。返回值的类型提示是定义在一个->箭头之后的。例如:

05e8dfc144b8106bd0a9585e18360301.png

在我们的getVowels()函数中,它有两个参数,既word(可以是一个字符串)和maxVowels(可以是一个整数或None)。此函数本身会返回一个字符串列表。像Mypy这样的工具可以验证return语句是否返回了vowels变量,该变量具有类型提示 List[str],它继而与函数的返回类型提示又相匹配。

那么Python 2中的类型提示怎么样呢?冒号不会导致语法错误吗?”

当然会,但是如果您写的是Python 2兼容的代码,您可以把类型提示放在注释里:

c65d3769237fea4f39bc467d0fb8682a.png

注意,即使使用了类型提示的注释风格,您仍然需要从typing导入对象。

“我已经开始使用类型提示,但我遇到了一个并不真正适用于我的代码的警告。我怎么让Mypy忽略这一行呢?”

您可以在该行的末尾添加一个注释# type: ignore:

231452e9845f6a4e4d9b04d9204c6c2e.png

“不错! 现在我已经具备了足够的基础知识去学习类型提示了。我在哪里可以学到更多有关类型提示的内容?”

请查看官方的Python文档或Mypy文档,从速查表开始。还有一个很受欢迎的关于类型提示的演讲,它是Carl Meyer在2019年PyCon大会上发表的。

英文原文:https://inventwithpython.com/blog/2019/11/24/type-hints-for-busy-python-programmers/ 
译者:野生大熊猫

04622c2b5bf3b9458fd3c07f0504506d.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值