类型提示会在函数参数中引起麻烦,但不会影响返回类型。

3

我对Python比较新,很高兴发现Python3中的类型提示功能。我阅读了PEP 484,并在这个SO问题中发现,提问者想知道为什么函数的返回类型没有被检查。回答者指出PEP 484中的一个部分说明了检查不会在运行时进行,并且意图是类型提示将由外部程序解析。

我启动了python3 REPL,并决定尝试一下。

>>> def greeting() -> str: return 1
>>> greeting()
1

到目前为止一切顺利。我对函数参数感到好奇,于是我尝试了以下代码:
>>> def greeting2(name: str) -> str: return 'hi ' + name
>>> greeting2(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in greeting2
TypeError: Can't convert 'int' object to str implicitly

现在问题似乎出在这里,因为至少在函数参数方面是有检查的。我的问题是为什么会对参数进行检查,但不对返回类型进行检查?

2
这不是类型检查,即使没有类型提示,您也会收到此错误。Python是一种强类型语言。 - juanpa.arrivillaga
它不检查函数参数的类型,因为它允许您使用整数而不是字符串调用“greeting2”。 - Simeon Visser
1个回答

5

Python在运行时不使用类型提示(对于函数参数和返回类型都不使用)。这与以下情况没有区别:

>>> def greeting3(name): return 'hi ' + name
...
>>> greeting3(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in greeting3
TypeError: Can't convert 'int' object to str implicitly

出现TypeError错误是因为您正在尝试连接一个字符串和一个整数:

>>> 'hi ' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly

正如所述,类型提示在运行时不会被检查,它们是为您的编辑器/工具在开发期间使用而设计的。

1
啊,好的,现在更有意义了。我应该更注意错误信息的文本。谢谢您的快速回复! - snerd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接