【发布时间】:2020-05-15 14:49:08
【问题描述】:
我有 2 个代码段来检查函数参数的数据类型。
第一个使用打字
def write_str(str1: str, file1_str: str):
return None
第二个使用assert。
def write_str(str1, file1_str):
assert (type(str1) == str and type(file1_str) == str)
return None
python 类型是否不需要使用断言检查?哪个代码段更好地捕捉错误?
我正在使用 python v3.7
【问题讨论】:
-
使用类型注解是很好的文档;它还可以让您对代码进行 lint,而 IDE 可以提供帮助。它不会“捕获”任何真正意义上的错误。断言是核的,通常也不提供有用的信息。 Python 不是强类型的,你永远不会 100% 地发现与类型相关的错误。
-
它们在完全不同的时间运行——当代码被检查时使用类型注释。 mypy,断言是在运行时(除非disabled)。
-
@erip,您认为在 python 中使用 assert 捕获函数参数中的数据类型错误是一种好习惯吗?
-
这个问题真的没有意义。如果 mypy can 捕获它,它肯定会在 assert 之前捕获,假设您在部署代码之前运行类型检查。至于这是否是一种好习惯,我建议(实际上是have recommended)不要使用
assert进行类型检查,而是抛出一个正确的TypeError(或者通过在运行时根本不检查来允许抛出一个错误)。 -
Python 代码通常不担心运行时类型检查。相反,使用了鸭子类型:如果
str1提供的值与str1的使用方式一致,那么实际类型是什么并不重要。
标签: python python-3.x assert type-hinting python-typing