Mypy捕获AttributeError

时间:2019-06-19 14:12:23

标签: python typing mypy

一直在使用以下代码

import yaml
try:
    filterwarnings(yaml.YAMLLoadWarning)
except AttributeError:
    pass

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

编辑:

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

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

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

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

def good(a: Optional[int]) -> int:
    if a:
        return a
    return 0

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

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

1 个答案:

答案 0 :(得分:0)

我假设您正在使用PyYAML?

在这种情况下,最好的长期解决方法是让您向Typeshed提交拉取请求,包括此类的类型提示。 (Typeshed是标准库模块和选择的第三方模块的类型提示的存储库。PyYAMLhappen to be included within typeshed here的存根。)

PyYAML似乎在模块的__init__.py文件中定义了YAMLLoadWarning,因此您可能应该在corresponding __init__.pyi file in Typeshed内为该类添加类型提示。

然后,您等待mypy的下一个发行版–它烘烤了Typeshed发布时最新可用的版本。

我认为mypy实际上已计划发布later today,因此如果最终提交PR,时间可能会很紧。但是在最坏的情况下,您只需要再等待一两个月,即可发布后续的mypy版本。

同时,您可以仅向该行添加suggested by Georgy in the comments# type: ignore注释。

如果执行此操作,我还建议使用--warn-unused-ignores命令行标志运行mypy。随着mypy随着时间的推移发布/改进,这将帮助您找到不再需要的# type: ignore条注释。