带有异常的 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 类型提示的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 CouchDB 和 Python 的机器学习来检测“异常行为”?

Python全栈开发之异常处理

python常见异常和异常捕获

python错误类型

python异常处理(学习)

Python 3 基础之异常及其捕获