returns None 函数的类型检查

TypeChecking for a function that returns None

考虑阶乘函数的递归实现-

from typing import Optional

def factorial(val: int) -> Optional[int]:
    if val<0:
        return None
    if val==0:
        return 1
    return val*factorial(val-1)


if __name__ == "__main__":
    print(square_root(3))

我正在使用 mypy 进行静态类型检查。它抛出以下错误 -

type-hints.py:8: error: Unsupported operand types for * ("int" and "None")
type-hints.py:8: note: Right operand is of type "Optional[int]"
Found 1 error in 1 file (checked 1 source file)

我尝试根据 Whosebug 问题使用 Optional。但这似乎不起作用。有什么建议吗?

问题 -

  1. 函数returns None时如何指定return类型?
  2. mypy 能够设想 intNone 之间可能发生乘法的情况,这让我感到有点惊讶。例如 - 如果我为 val 参数删除 int 并使用浮点数调用阶乘函数,它可能会抛出此类错误。

MyPy 是正确的,函数不是well-typed。函数的签名是 (int) -> Optional[int],使得 val*factorial(val-1) 可能 错误。 None 只出现在 val < 0 而不是 静态类型信息。

不是为无效输入返回 None,而是引发异常。这使得函数静态 well-typed,而不删除错误处理。

def factorial(val: int) -> int:
    if val<0:
        raise ValueError("factorial() not defined for negative values")
    if val==0:
        return 1
    return val*factorial(val-1)

如果由于某种原因需要返回 None,请明确注释表达式是正确的,不需要检查。

def factorial(val: int) -> int:
    if val<0:
        return None
    if val==0:
        return 1
    return val*factorial(val-1)  # type: ignore