我正在研究python中的typing
模块,因为我希望在用python编写的项目中实施一些静态类型检查。在
当我定义一个像the one from the doc这样的函数时
def greeting(name: str) -> str:
return 'Hello ' + name
尝试做类似greeting(3)
的操作,我确实得到了以下错误
但是当我再次定义一个名为test
的函数时
def test(a: int) -> None:
print(a)
做test("a")
,我已经打印了a
,没有出现任何错误。我也试过了
def test(a: str) -> None:
print(a)
并执行test(3)
,但不会引发TypeError。在
我在完全相同的环境中定义了这两个函数,即使用iTerm的交互python会话。为什么会这样?在
python中的类型注释不实施静态类型检查。在
Python仍然是一种动态语言,解释器在执行循环中到达这一行时,会检查它是否有执行操作的方法,添加str(“hello”)并添加一个整数(3)。Pep-484声明核心开发人员不想用注解来改变这一点。在
如果您查看文档,它被称为'type hints'。暗示不是强制执行。在
类型提示实际上是为开发人员及其工具(如ide)提供的,以更好地记录参数的预期类型。但是添加这种形式的文档并没有对论点施加任何限制。它仅仅是文档。事实上,最好将这些注释看作文档。在
您看到的错误在没有这些注释的情况下发生。E、 g
如果你愿意,可以开发工具来完成这项工作。对象的注释
^{pr2}$为什么会这样? 在python中,我们通常不做显式类型检查。相反,我们只是尝试调用该方法,比如“add'hello”和“3”,并允许出现错误。由函数的调用方提供正确的类型。但这也意味着要由函数的编写者来精确地记录参数。类型提示有助于描述预期的类型,并使其在对象上可用,这对于其他工具随后挂接非常有用。以前,我们会把这些东西写成文档,比如:
使用duck类型帮助您 如果在调用add之前使用内置字符串格式或将传入值强制转换为字符串,则可以避免引发的类型错误。例如,为了避免您看到的错误,您可以:
这里的线索在行号中:当您试图添加
'Hello'
和3
时,错误发生在函数内部。解释器会检查类型注释的语法正确性,但不会以其他方式进行操作。在像^{} 这样的项目使用注释进行状态类型检查和其他各种用途。在
相关问题 更多 >
编程相关推荐