Arn*_*rne 5 python elementtree mypy
我用来ElementTree解析/构建一些稍微复杂但定义良好的 xml 文件,并用于mypy静态类型。我的.find陈述遍布各处,这导致了这样的事情:
from xml.etree.ElementTree import Element
...
root.find('tag_a').append(Element('tag_b'))
# run mypy..
-> type None from Optional[Element] has no attribute append
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为find根本找不到我给它的标签。但我知道它就在那里,并且不想添加类似try..exceptorassert语句之类的东西,本质上只是简单地保持沉默mypy,而不添加功能,同时使代码可读性较差。我也想避免# type: ignore到处发表评论。
我尝试了猴子修补Element.find.__annotations__,在我看来这将是一个很好的解决方案。但由于它是内置的,我不能这样做,而且子类化Element又感觉太多了。
有没有好的办法解决这个问题呢?
我们可以编写一个实用函数,它在内部处理None发现的情况并引发异常/返回给定类型的一些虚拟值:
from xml.etree.ElementTree import Element
def find(element: Element,
tag: str) -> Element:
result = element.find(tag)
assert result is not None, ('No tag "{tag}" found '
'in element "{element}".'
.format(tag=tag,
element=element))
return result
Run Code Online (Sandbox Code Playgroud)
断言的优点(与手动引发异常相比)是它们可以被禁用 ,但如果您正在使用一些用户提供的数据,我建议引发一个异常,例如
if result is None:
raise LookupError('No tag "{tag}" found '
'in element "{element}".'
.format(tag=tag,
element=element))
Run Code Online (Sandbox Code Playgroud)
我使用类型注释,因为它有助于 IDE,并且在阅读 API 时也节省了大量时间,但我不是 mypy 用户,因为我不喜欢像在这种情况下那样检查所有内容的想法:如果函数用户通过垃圾,那么这是他的错,我们应该让他这样做,而不是写一些关于“你有一个类型的联合,并且不处理其中一些案例”的东西,毕竟 EAFP。
| 归档时间: |
|
| 查看次数: |
1916 次 |
| 最近记录: |