Python 现在支持类型提示,所以...耶!这似乎是避免一些更晦涩的运行时错误的好方法。
可悲的是,第三方库支持仍然是一个问题。虽然 mypy 也使用了 typeshed 项目部分解决了这个问题,但在尝试移植我的一些代码以使用类型提示时,由于缺少存根,我遇到了问题。
例如
# file:mypytest.py
import lxml.etree as et
tree = et.fromstring('<root><a>1</a><b>2</b><a>3</a></root>')
items = tree.xpath('/root/a')
print([i.text for i in items])
会很好地工作,但 mypy 会产生虚假的错误消息
>>> mypy mypytest.py
mypytest.py:3: error: "_Element" has no attribute "xpath"
因为存根当前不完整。
对于一个更大的项目,从 typeshed 下载存根,添加缺失的条目,甚至提交相应的拉取请求是一件轻而易举的事。
但是有什么方法可以在快速而肮脏的场景中修补缺失的信息吗?
糟糕的解决方法
我能想到的最好的是
items = tree.xpath('/root/a') # type: ignore
这可以消除错误,但也会禁用items
之后使用变量的类型检查。例如items[0] + 1
,不会再引起警告。
为了保留类型检查,可以使用
items_tmp = tree.xpath('/root/a') # type: ignore
items = items_tmp # type: List[et._Element]
但这似乎很老套;它还必须在.xpath
使用该方法的任何地方重复。
从 2017-09-12 更新:或者可以使用语法
items_tmp : List[et._Element] = tree.xpath('/root/a') # type: ignore