Python现在支持类型提示,所以......耶!这似乎是避免一些比较模糊的运行时错误的好方法。
可悲的是,第三方图书馆支持仍然存在问题。虽然部分由typeshed项目解决,mypy项目也被{{3}}使用,但在尝试移植我的一些代码以使用类型提示时,由于缺少存根而遇到了问题。
E.g。
# 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下载存根,添加缺少的条目,甚至提交相应的pull请求都是明智之举。
但是有一些方法可以在快速和肮脏的场景中修补丢失的信息吗?
我能想到的最好的是
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