一直在使用以下代码
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 []
答案 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
条注释。