我在使用 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 { ... }
我很感激任何建议。
如果有人继承
Exp
并将其作为值传递给 eval_exp_old()
怎么办?
class NewExp(Exp): pass
eval_exp_old(NewExp()) # silently returns None