Mypy并不真正深入地理解异常——在本例中,它不理解因为您正在捕获attributerror,所以它可以忽略“如果
regex.match(path)
没有吗?”案例。
一般来说,mypy的基本假设是
foo
带类型
Union[A, B]
你也知道
foo.bar()
,两种类型
A
和
B
有一个
bar()
方法。
如果这些类型中只有一个有
巴()
方法,您需要执行以下操作之一:
-
在执行属性访问之前,给mypy足够的信息来将联合范围缩小到一个相关类型。例如,isinstance检查,
x is not None
检查。。。
-
确认您正在尝试执行类型检查器无法理解的操作,并解决抑制生成的错误的问题。例如,可以强制转换类型,在
# type: ignore
评论,想办法
福
充满活力
Any
键入。。。
-
找到一种重新设计代码的方法来回避这个问题。
(在这个特殊的例子中,我想另一个选择可能是向mypy提交一个pull请求,添加对这个模式的支持。但我不确定这是否真的可行:改变任何一种基本假设在多个维度上都是困难的。)
类似地,Mypy也不理解深层次的正则表达式——例如,不尝试分析正则表达式来确定将得到多少组,因此不理解特定的正则表达式恰好将字符串与正好两个组匹配。它所能做的就是断言组将返回一些未知数目的字符串,因此
Sequence[str]
而不是
Tuple[str, str]
.
这种限制通常在类型检查程序中很常见,实际上:主流语言中的大多数类型系统并不真正支持基于传入的任何实际值的内容对返回类型进行谓词。这种类型的系统(依赖型系统、求精型系统……)很难实现,而且对于最终用户来说,往往有一个陡峭的学习曲线。
然而,它
将
更容易让mypy在
尽力而为
通过写一个
mypy plugin
,如果你愿意的话。具体来说,试着看看
get_method_hook()
和
get_function_hook()
.