我一直在使用以下代码
import yaml
try:
filterwarnings(yaml.YAMLLoadWarning)
except AttributeError:
pass但是当我今天尝试运行mypy时,我得到了"module has no attribute 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 []发布于 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会发布/改进。
https://stackoverflow.com/questions/56669787
复制相似问题