我正在查看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会话。为什么会这样?
答案 0 :(得分:1)
这里的线索在行号中:当您尝试添加'Hello'
和3
时,函数内部发生错误。解释器会检查类型注释的语法正确性,但不会采取其他措施。
有些像mypy
的项目使用注释进行状态类型检查和其他各种用途。
答案 1 :(得分:1)
类型注释请勿强制执行静态类型检查。
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不会检查您提供的参数是否与类型注释中指定的类型匹配!