Mypy 捕获属性错误

Pau*_*tte 5 python typing mypy

一直在使用以下代码

import yaml
try:
    filterwarnings(yaml.YAMLLoadWarning)
except AttributeError:
    pass
Run Code Online (Sandbox Code Playgroud)

但是当我今天尝试运行 mypy 时,我得到“模块没有属性 YAMLLoadWarning”。这在某些版本的 python 上是正确的。有更好的方法来写这个吗?

编辑:

为了更清楚一点,我知道如何忽略错误(并捕获与 python 3.6 版本的 pyyaml 相关的异常,不包括该异常)。我的问题更多是关于使用解析器。考虑这些例子——

我知道如果你有一个返回更具体类型的函数

def bad(a: Optional[int]) -> int:
    return a  # Incompatible return value type (got "Optional[int]", expected "int")
Run Code Online (Sandbox Code Playgroud)

您可以使用分支强制仅返回正确的类型,并且解析器会注意到

def good(a: Optional[int]) -> int:
    if a:
        return a
    return 0
Run Code Online (Sandbox Code Playgroud)

那么,在使用 try/catch 语句处理错误情况的情况下,是否有一种方法可以构造此语句,以便解析器意识到属性错误已被处理?

def exception_branch(a: Optional[str])-> list:
    try:
        return a.split()  # Item "None" of "Optional[str]" has no attribute "split"
    except:
        return []
Run Code Online (Sandbox Code Playgroud)

小智 1

那么,在使用 try/catch 语句处理错误情况的情况下,是否有一种方法可以构造此语句,以便解析器意识到属性错误已被处理?

不,恐怕没有。问题是catch AttributeError没有表明异常来自哪里。所以如果你有

try:
    print(foo.barr)
    return a.split()
except AttributeError:
    return []
Run Code Online (Sandbox Code Playgroud)

a类型检查器可以忽略可以存在的事实None,但它也必须忽略拼写错误并且对象中bar没有属性的事实。另请参阅此处barrfoo