为什么类型检查在Python 3中不起作用?
我使用类型检查或提示完成了以下代码:
import typing
def hello(message: str):
print(type(message))
print(message)
hello('Hello!')
hello(1)
hello(1.1)
它产生有效输出(但在int或float上没有错误)。
<class 'str'>
Hello!
<class 'int'>
1
<class 'float'>
1.1
为什么这样做?也许我不理解输入模块和Python提示。
答案 0 :(得分:4)
Python的类型提示仅供参考。参数类型的类型检查或自动强制不是语言的一部分。见PEP 3107:
函数注释只不过是一种在编译时将任意Python表达式与函数的各个部分相关联的方法。
附加模块可以使用类型提示 来检查参数类型和返回值,甚至可以强制参数到期望类型。例如,here是一个模块,它会检查参数类型并在发现不匹配时抱怨。
但这不是Python本身的工作原理,所以不要依赖它,也不要寻找将它带入代码的方法。在Python风格中,您的函数应该尽可能灵活地编写它们可以使用的参数类型(google“duck typing”)。如果他们得到了他们无法处理的东西......那么,这就是例外情况。
答案 1 :(得分:3)
Python 3没有您正在寻找的那种类型检查。
def hello(message: str):
这是功能注释。
https://www.python.org/dev/peps/pep-3107/
它所做的就是将一些额外的数据与功能对象相关联。这可以稍后在函数的func_annotations
属性上进行检查。
除此之外没有内置行为。目的是让第三方在此基础上建立行为。
答案 2 :(得分:2)
类型提示只是提示,它们应该告诉用户期望的功能不是它需要的功能。 PEP中明确提到了这一点:PEP 3107:
功能注释的基础知识
在开始讨论Python 3.0的功能注释的精确细节之前,让我们首先广泛谈论注释是什么和不是:
参数和返回值的函数注释都是完全可选的。
函数注释只不过是一种在编译时将任意Python表达式与函数的各个部分相关联的方法。
Python本身并没有对注释附加任何特定的含义或意义。 [...]
答案 3 :(得分:2)
你想要的是static typing
,它与python接受的dynamic typing
范例相反。
您可以使用mypy - 一个为python带来静态类型的项目。
答案 4 :(得分:1)
他们被称为&#34;类型提示&#34;因为某种原因。 Python只提供了以标准和结构化方式标记类型的选项,以指导其他程序员或促进IDE错误检查。
然而,Python并没有强制执行这些提示,也没有任何计划,它们就是这样,只不过是评论。