类型检查是否返回无值的函数

问题描述

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

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)

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

问题-

  1. 函数返回None时如何指定返回类型?
  2. 令我惊讶的是 mypy 能够预见到intNone之间可能发生乘法的情况。例如-如果我删除 val 参数的int并以浮点数调用阶乘函数,则可能会抛出此类错误。

解决方法

MyPy是正确的,该函数的类型不正确。函数的签名为(int) -> Optional[int],使val*factorial(val-1) 可能错误。 None仅发生在val < 0不是静态类型信息。

引发异常,而不是返回None以获取无效输入。这样一来,该函数可以进行静态类型化,而无需删除错误处理。

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...