使用返回类型声明处理 Python 类型检查器错误

问题描述 投票:0回答:1

我在使用 Pyright 类型检查器的 Python 代码中遇到问题,特别是当我尝试从返回类型声明中删除 Any 时。

首先查看/阅读这个问题:使用返回类型声明处理 Python 类型检查器错误(字段默认值 = None)

错误信息:

Function with declared return type "int" must return value on all code paths. "None" is incompatible with "int".

这个案子怎么样?即使我的类不包含任何 None,我仍然遇到与上面相同的错误(来自堆栈溢出的问题)。

from dataclasses import dataclass
from typing import Any, Union, List

class Exp:
    pass

@dataclass
class Const(Exp):
    value: int

@dataclass
class Negate(Exp):
    value: Exp

@dataclass 
class Add(Exp):
    value1: Exp
    value2: Exp

@dataclass
class Multiply(Exp):
    value1: Exp
    value2: Exp


def eval_exp_old(e: Exp) -> int | Any:
    match e:
        case Const(i):
            return i
        case Negate(e2):
            return -eval_exp_old(e2)
        case Add(e1, e2):
            return eval_exp_old(e1) + eval_exp_old(e2)
        case Multiply(e1, e2):
            return eval_exp_old(e1) * eval_exp_old(e2)
        

test_exp: Exp = Multiply(Negate(Add(Const(2), Const(2))), Const(7))
# -28
old_test = eval_exp_old(test_exp)

错误:

def eval_exp_old(e: Exp) -> int { ... }

我很感激任何建议。

python pattern-matching pyright
1个回答
0
投票

如果有人继承

Exp
并将其作为值传递给
eval_exp_old()
怎么办?

class NewExp(Exp): pass
eval_exp_old(NewExp())  # silently returns None
© www.soinside.com 2019 - 2024. All rights reserved.