首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mypy catch AttributeError

Mypy catch AttributeError
EN

Stack Overflow用户
提问于 2019-06-19 22:12:24
回答 1查看 873关注 0票数 4

我一直在使用以下代码

代码语言:javascript
复制
import yaml
try:
    filterwarnings(yaml.YAMLLoadWarning)
except AttributeError:
    pass

但是当我今天尝试运行mypy时,我得到了"module has no attribute YAMLLoadWarning“。这在python的某些版本上是正确的。有没有更好的方法来写这篇文章?

编辑:

更清楚地说,我知道如何忽略错误(并捕获与python 3.6版本的pyyaml相关的异常,但不包括该异常)。我的问题更多的是关于如何使用解析器。请考虑以下示例:

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

代码语言:javascript
复制
def bad(a: Optional[int]) -> int:
    return a  # Incompatible return value type (got "Optional[int]", expected "int")

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

代码语言:javascript
复制
def good(a: Optional[int]) -> int:
    if a:
        return a
    return 0

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

代码语言:javascript
复制
def exception_branch(a: Optional[str])-> list:
    try:
        return a.split()  # Item "None" of "Optional[str]" has no attribute "split"
    except:
        return []
EN

回答 1

Stack Overflow用户

发布于 2019-06-20 04:26:08

我猜你在用PyYAML?

在这种情况下,最好的长期修复方法可能是向Typeshed提交一个pull请求,其中包括此类的类型提示。(Typeshed是标准库模块和选择的第三方模块的类型提示的存储库。PyYAML happen 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。这将帮助你找到你不再需要的# type: ignore注释,因为随着时间的推移,mypy会发布/改进。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56669787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档