python - Mypy 捕获 AttributeError
问题描述
一直在使用以下代码
import yaml
try:
filterwarnings(yaml.YAMLLoadWarning)
except AttributeError:
pass
但是当我今天尝试运行 mypy 时,我得到“模块没有属性 YAMLLoadWarning”。这在某些版本的 python 上是正确的。有没有更好的方法来写这个?
编辑:
为了更清楚一点,我知道如何忽略错误(并捕获与 python 3.6 版本的 pyyaml 相关的异常,不包括该异常)。我的问题更多是关于使用解析器。考虑这些例子——
我知道如果你有一个返回更具体类型的函数
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 []
解决方案
我假设您正在使用 PyYAML?
在这种情况下,最好的长期解决方案可能是您向 Typeshed 提交拉取请求,包括此类的类型提示。(Typeshed 是标准库模块和选择第三方模块的类型提示的存储库。PyYAML 的存根恰好包含在 typeshed here中。)
PyYAML 似乎YAMLLoadWarning
在模块的文件中定义,因此您可能应该在 Typeshed的相应__init__.py
文件中为该类添加类型提示。__init__.pyi
然后等待 mypy 的下一个版本——它会在发布时使用最新可用的 Typeshed 版本。
我相信 mypy 实际上计划在今天晚些时候发布,所以如果你最终提交 PR,时间可能会有点紧。但最坏的情况是,您只需要再等一两个月即可发布后续的 mypy。
与此同时,您可以按照Georgy 在评论中的建议,# type: ignore
向该行添加评论。
如果你这样做,我还建议使用--warn-unused-ignores
命令行标志运行 mypy。这将帮助您找到# type: ignore
不再需要的评论,因为 mypy 随着时间的推移发布/改进。
推荐阅读
- batch-file - 下载具有错误 EOL 序列的文件
- arrays - 在 C 中制作随机整数数组时的奇怪问题
- node.js - 我从 Node.js 服务器调用 APNS 通知时遇到问题。这是我要回来的错误
- powerbi - COALESCE 和 DIVIDEs 交替结果有什么区别?
- c# - 将两个数字之间的所有数字相加
- python - Python:将循环变量相乘的 C 代码 for 循环
- django - 无效的 HTTP_HOST 标头:“127.0.0.1:8000”。您可能需要将“127.0.0.1”添加到 ALLOWED_HOSTS。在 Django
- c++ - 显式模板实例化和调试加载时间
- python - 在 python 中通过比较来加速函数
- jquery - 向动态 JSON 值添加类