首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeChecking用于返回None的函数。

TypeChecking用于返回None的函数。
EN

Stack Overflow用户
提问于 2020-08-22 19:54:44
回答 1查看 658关注 0票数 2

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

代码语言:javascript
复制
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进行静态类型检查。它让我犯了以下错误-

代码语言:javascript
复制
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的堆栈溢出问题使用this。但似乎不起作用。有什么建议吗?

Questions -

当函数返回None

  • Seems时,
  1. 如何指定返回类型,这让我有点惊讶,因为mypy能够想象intNone之间可能发生乘法的情况。例如,如果我为val参数移除int并使用浮点数调用阶乘函数,它可能会抛出这样的错误。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-22 20:01:30

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

不要返回无效输入的None,而是引发异常。这使得函数静态地输入良好,而不删除错误处理。

代码语言:javascript
复制
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,则显式注释该表达式是声音的,不需要检查。

代码语言:javascript
复制
def factorial(val: int) -> int:
    if val<0:
        return None
    if val==0:
        return 1
    return val*factorial(val-1)  # type: ignore
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63540516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档