问题描述
考虑阶乘函数的递归实现-
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
。但这似乎不起作用。有什么建议吗?
问题-
- 函数返回
None
时如何指定返回类型? - 令我惊讶的是 mypy 能够预见到
int
和None
之间可能发生乘法的情况。例如-如果我删除 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