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
。但这似乎不起作用。有什么建议吗?
问题 -
- 函数returns
None
时如何指定return类型?
- mypy 能够设想
int
和 None
之间可能发生乘法的情况,这让我感到有点惊讶。例如 - 如果我为 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
考虑阶乘函数的递归实现-
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)
我尝试根据 Optional
。但这似乎不起作用。有什么建议吗?
问题 -
- 函数returns
None
时如何指定return类型? - mypy 能够设想
int
和None
之间可能发生乘法的情况,这让我感到有点惊讶。例如 - 如果我为 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