我有以下(类型化) Python函数:
from typing import overload, Literal, NoReturn
@overload
def check(condition: Literal[False], msg: str) -> NoReturn:
pass
@overload
def check(condition: Literal[True], msg: str) -> None:
pass
def check(condition, msg):
if not condition:
raise Exception(msg)Pyright类型检查程序抱怨:
Overloaded function implementation is not consistent with signature of overload 1
Function return type "NoReturn" is incompatible with type "None"
Type cannot be assigned to type "None"我对此感到困惑--显然,Pyright无法确定如果条件为False,False总是会抛出错误。我怎么才能按摩这个让它工作呢?
发布于 2021-12-12 23:56:23
我将其发布到Pyright问题跟踪器,是知会,我必须向check实现中添加一个Union[NoReturn, None]注释,以解决错误:
这不符合pyright的返回类型推断规则。只有在所有代码路径引发异常的情况下,Pyright才会推断出NoReturn类型。一些代码路径引发异常是很常见的,如果pyright在这种情况下包含NoReturn,则会产生许多错误,因此NoReturn总是从推断返回类型的联合中省略。 mypy不支持任何返回类型推断,所以这解释了为什么Mypy不会出现这种情况。 对此进行注释的正确方法是为实现包含一个显式的None \ NoReturn返回类型。
不幸的是,这首先违背了重载的目的,即允许PyRight在NoReturn是返回类型时从参数推断。我询问是否可以使用overloads将NoReturn有条件地表示为类型检查器。显然它不是
不幸的是,由于其核心架构,pyright无法做出这一决定。代码流图中节点的“可达性”不能依赖于类型计算,因为类型评估取决于代码流节点的可达性。为了解决这个鸡和蛋问题,确定可达性的逻辑进行一些基本检查,以确定被调用的函数是否可能是"NoReturn“函数,但这些基本检查不够复杂,无法处理过载评估。评估重载需要完整类型的评估器,这取决于可达性。
https://stackoverflow.com/questions/70327505
复制相似问题