首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python检查: Literal[False]、重载和NoReturn

Python检查: Literal[False]、重载和NoReturn
EN

Stack Overflow用户
提问于 2021-12-12 20:38:16
回答 1查看 377关注 0票数 6

我有以下(类型化) Python函数:

代码语言:javascript
复制
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类型检查程序抱怨:

代码语言:javascript
复制
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无法确定如果条件为FalseFalse总是会抛出错误。我怎么才能按摩这个让它工作呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-12 23:56:23

我将其发布到Pyright问题跟踪器,是知会,我必须向check实现中添加一个Union[NoReturn, None]注释,以解决错误:

这不符合pyright的返回类型推断规则。只有在所有代码路径引发异常的情况下,Pyright才会推断出NoReturn类型。一些代码路径引发异常是很常见的,如果pyright在这种情况下包含NoReturn,则会产生许多错误,因此NoReturn总是从推断返回类型的联合中省略。 mypy不支持任何返回类型推断,所以这解释了为什么Mypy不会出现这种情况。 对此进行注释的正确方法是为实现包含一个显式的None \ NoReturn返回类型。

不幸的是,这首先违背了重载的目的,即允许PyRightNoReturn是返回类型时从参数推断。我询问是否可以使用overloads将NoReturn有条件地表示为类型检查器。显然它不是

不幸的是,由于其核心架构,pyright无法做出这一决定。代码流图中节点的“可达性”不能依赖于类型计算,因为类型评估取决于代码流节点的可达性。为了解决这个鸡和蛋问题,确定可达性的逻辑进行一些基本检查,以确定被调用的函数是否可能是"NoReturn“函数,但这些基本检查不够复杂,无法处理过载评估。评估重载需要完整类型的评估器,这取决于可达性。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70327505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档