python中的类型注释意味着静态类型检查?

时间:2019-02-17 14:03:18

标签: python typechecking static-typing

我正在查看python中的typing模块,因为我希望在以python编写的项目中执行一些静态类型检查。

当我定义类似the one from the doc的函数时

def greeting(name: str) -> str:
    return 'Hello ' + name

尝试执行类似greeting(3)的操作,我确实遇到了以下错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in greeting
TypeError: must be str, not int

但是当我再次定义一个名为test

的函数时
def test(a: int) -> None:
    print(a)

并执行test("a"),我打印了a,没有出现任何错误。我也尝试过

def test(a: str) -> None:
    print(a)

执行test(3),但不会引发TypeError。

我在完全相同的环境中定义了这两个函数,即使用iTerm的交互python会话。为什么会这样?

3 个答案:

答案 0 :(得分:1)

这里的线索在行号中:当您尝试添加'Hello'3时,函数内部发生错误。解释器会检查类型注释的语法正确性,但不会采取其他措施。

有些像mypy的项目使用注释进行状态类型检查和其他各种用途。

答案 1 :(得分:1)

python中的

类型注释请勿强制执行静态类型检查。

Python仍然是一种动态语言,解释器检查它是否具有执行操作的方法,并在执行循环中到达此行时添加str(“ hello”)并添加整数(3)。 Pep-484声明核心开发人员不希望通过注释来对此进行更改。

如果您查看文档,则称为'type hints'。提示不是强制性的。

类型提示确实适用于开发人员及其工具(例如IDE),以更好地记录所需的参数类型。但是添加这种形式的文档不会对该参数施加任何限制。它只是仅仅是文档。实际上,最好将这些注释视为文档

您看到的错误在没有这些注释的情况下发生。例如

>>> "Hello" + 3
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

如果需要,可以开发工具来执行此操作。对象的

上的注释
__annotations__

为什么会这样? 在python中,我们通常不进行显式类型检查。相反,我们只是尝试调用该方法,例如“ add'hello'and 3”,并使其出现错误。由函数的调用者提供正确的类型。但这也意味着由函数的编写者来准确记录参数。类型提示有助于描述期望的类型,并使它在对象上可用,这对于随后挂接到其他工具很有用。以前,我们会将这些内容编写为文档,例如:

def greeting(name):
    """Greeting to name
    :param name: str, the name to greet
    Returns string"""
    return "hello" + name

使用鸭子打字来帮助您 如果在调用add之前使用了内置字符串格式或将传入值转换为字符串,则可以避免引发的类型错误。例如,为避免看到错误,您可以:

 def greeting(name: str) -> str:
    """Greeting to name
    :param name: str, the name to greet
    Returns string"""
    return "hello" + str(name)

def greeting(name: str) -> str:
    """Greeting to name
    :param name: str, the name to greet
    Returns string"""
    return "hello {}".format(name)

答案 2 :(得分:0)

类型注释是注释。它们不会以任何方式影响Python解释器的基本功能。 Python不会检查您提供的参数是否与类型注释中指定的类型匹配!