带有异常的 Python 类型提示
Posted
技术标签:
【中文标题】带有异常的 Python 类型提示【英文标题】:Python type hinting with exceptions 【发布时间】:2017-11-01 02:39:35 【问题描述】:我有一个看起来像这样的函数:
def check_for_errors(result):
if 'success' in result:
return True
if 'error' in result:
raise TypeError
return False
在成功运行这个函数时,我应该得到一个bool
,但如果有错误我应该得到一个TypeError
- 这没关系,因为我在另一个函数中处理它。
我的函数第一行如下所示:
def check_for_errors(result: str) -> bool:
我的问题是:我应该在类型提示中提及错误吗?
【问题讨论】:
【参考方案1】:类型提示不能说明异常。它们完全超出了该功能的范围。但是,您仍然可以在文档字符串中记录异常。
来自PEP 484 -- Type Hints:
例外情况
没有建议列出显式引发的异常的语法。目前,此功能的唯一已知用例是文档化,在这种情况下,建议将此信息放在文档字符串中。
Guido van Rossum has strongly opposed adding exceptions 到类型提示规范,因为他不想最终陷入需要检查(在调用代码中处理)或显式声明异常的情况每个级别。
【讨论】:
或者检查你没有隐式引发人们没想到的奇怪异常的用例 @ErikAronesty:定义奇怪。所有代码都可以引发MemoryError
,大多数代码都可以引发KeyboardInterrupt
。与类型提示相比,好的 linter 可以帮助您更好地理解异常。
如果返回了异常,而不是引发异常怎么办?例如。 NotImplemented 可以返回。
@EduardGrigoryev: NotImplemented
不是一个例外,它是一个singleton object,一个特殊的标志值。你在想NotImplementedError
。仍然可以返回异常,异常只是继承BaseException
的类,因此您可以使用Type[BaseException]
键入提示接受或返回异常类的函数,例如。
@shaunc: 是的:typing.NoReturn
.【参考方案2】:
记录错误通常是个好主意。这意味着使用您的函数的其他开发人员将能够处理您的错误,而无需通读您的代码。
【讨论】:
以上是关于带有异常的 Python 类型提示的主要内容,如果未能解决你的问题,请参考以下文章