|
8
|
| juanpa.arrivillaga · 技术社区 · 7 年前 |
|
|
1
4
恐怕不会有一种特别干净的方法来解决这个问题,至少,我个人没有意识到。正如您所观察到的,您的类型签名包含一个mypy不允许的基本模糊性:如果您尝试调用
有关此问题的更多讨论,请参阅上的mypy文档 checking overload invariants --搜索讨论“本质上不安全的重叠变体”的段落,然后从中开始阅读。 但是,在这种特定的情况下,我们可以通过拼写出更精确地匹配实际运行时行为的重载来自由摆动。特别是,我们有一个很好的属性,如果任何一个参数是“无”,我们 必须 也不返回。如果我们对此进行编码,mypy最终会满足:
事实上,这一方法最初似乎令人惊讶——毕竟,我们传递了一个类型为
Mypy在这里做的是非正式的“联合数学”——它基本上观察到
最后的返回类型是这些值的并集:
当然,这个解决方案的主要缺点是,它非常冗长——可能在一个无法忍受的程度上,这取决于您有多少助手函数,以及这个“我们可能不会返回任何”问题在代码库中的普遍性。 如果是这样的话,您可以做的事情就是在代码库中普遍存在“无”的情况下宣布“破产”,并开始运行mypy "strict optional" mode disabled .
简而言之,如果你用
这会削弱代码的类型安全性(有时会显著降低),但是 将 让您简化代码,使其看起来像这样:
严格来说,过载检查应该报告“不安全重叠”错误,原因与启用严格可选时返回的原因相同。但是,如果我们这样做,那么当禁用严格可选时,重载将完全不可用:因此,mypy故意削弱这里的检查,忽略特定的错误情况。
这种模式的主要缺点是您现在被迫进行更多的运行时检查。如果你收到一些类型的值
在您的案例中,这可能是一个不错的折衷方案,因为您已经将这些类型的运行时检查分散到了所有地方。 如果您订阅了“空是一个十亿美元的错误”的思想流派,并且希望生活在严格的可选世界中,您可以使用的一种技术是通过使用 mypy config file . 基本上,您可以通过配置文件在每个模块的基础上配置许多(尽管不是全部)mypy选项,如果您试图将类型添加到预先存在的代码库中,并发现一次性转换是很难处理的,那么这非常方便。从松散的全局设置开始,然后随着时间的推移逐步使它们更严格。
如果这两个选项都过于极端(例如,您不想从上面到处添加详细签名,但也不想放弃严格的可选选项),那么您可以做的最后一个选项就是
沉默
通过添加
这在某种程度上也是失败,但可能是一种更本地化的失败。偶数
typeshed
是标准库的类型提示库,包含一些分散的
这是否是一个解决方案,你可以取决于你的具体情况。如果您分析代码库,并认为潜在的不安全性是您可以忽略的,也许这是最简单的前进方式。 |
|
|
Cam · Pandas列表日期到日期时间 1 年前 |
|
|
LMC · Numpy数组布尔索引以获取包含元素 1 年前 |
|
|
vr8ce · 非成对标记中特定字符的正则表达式 1 年前 |
|
|
ShaAnder · 为什么sqllachemy返回的是类而不是字符串 1 年前 |
|
|
Pernoctador · Python映射可以复制吗?我需要参考地图 1 年前 |