【发布时间】:2022-01-05 08:09:01
【问题描述】:
来自 C/C++ 背景,我一直对 Python 缺乏强大的类型检查感到失望。因此,它总是引导我编写这种风格的代码:
def function (this_should_be_list, this_should_be_int):
isFristArgList = isinstance(this_should_be_list,list)
if not isFristArgList:
raise Exception("The first argument should be a list!")
isSecondArgInt = isinstance(this_should_be_int,int)
if not IsSecondArgInt:
raise Exception ("The second argument should be an int!")
....
....
....
return
这导致代码更加复杂和臃肿,在我的理解中,这与编写尽可能清晰的代码的“Pythonic 哲学”相反。与这种动态检查方法相反,有人可能会说,如果没有它,function 也会失败并引发一些异常,因此它并没有什么区别,但我认为这真的很难预测(尤其是在具有多个嵌套调用的更大代码库中)是否存在某些极端情况错误,这些错误将使 function 在“表面”上正确执行,但与我们的预期不符。
所以我的问题是,我应该如何在 Python 中解决这个问题? 由于我以前使用 C/C++ 的经验,我是否只是偏向于强类型的“样式”,并且应该只接受 Python 的鸭子类型? 或者,有没有更优雅的方式在 Python 中进行类型检查?
【问题讨论】:
-
首先你可以使用类型提示来代替。那么就没有规则了:如果您发现有人在滥用您的 API 或者错误消息在他们这样做时很含糊,那么您就可以开始保护您的 API。否则让鸭子打字行动
-
虽然 python 不支持强类型检查,但它支持类型提示已经有一段时间了,至少 3.5 及更高版本。请参阅文档中的 Support for type hints。
-
使用 mypy! mypy-lang.org
标签: python strong-typing duck-typing