python - MyPy - 处理可能的 None 返回类型

标签 python python-3.x types mypy

也许令我羞愧的是,我刚刚开始在我的 python 代码中包含类型检查。大多数类型检查都是直接进行的,但我对处理可以返回 None 的函数的 pythonic 方式有点迷失

例如

threads = os.cpu_count() * 1.2

这会引发 MyPy 错误

Mypy: Unsupported operand types for * ("None" and "float")

因此,为了摆脱这个问题,我将代码更改为

default = (os.cpu_count() if os.cpu_count() is not None else 1.0) * 1.2

但这给出了完全相同的错误。

处理这个问题的最佳方法是什么?

最佳答案

您的原始代码未通过 mypy,因为您对同一函数有两次不同的调用,并且每次调用都返回不同的 Optional[int]。缩小一种类型不会影响另一种类型。考虑这个极端的情况:

import random

def maybe_an_int() -> Optional[int]:
    if random.random() > 0.9:
        return 1
    return None

default = (maybe_an_int() if maybe_an_int() is not None else 1.0) * 1.2

如果第一次调用不是 None,我们会再次调用它。但显然,由于返回类型是随机的,我们无法预测第二次调用的返回类型是什么。

许多代码库都有不同的方法来处理这个问题。一种选择是这样的:

from typing import TypeVar

T = TypeVar('T')

def default_optional(value: Optional[T], default: T) -> T:
    if value is None:
        return default
    return value

关于python - MyPy - 处理可能的 None 返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60394341/

相关文章:

Python:从字符串中提取数字

python - 在 DataFrame 中编码多个标签

python-3.x - 使用 Zappa 部署到 AWS 后端点失败

python - Pandas :将行从一个数据框添加到另一个数据框?

list - OCaml:可以包含两种类型的列表?

python - 在 Django 中运行纯 SQL 查询时如何获取字段名称

python - Ruby 到 Python 的桥梁

python - 使用必须导入其他模块的模块运行 unittest

haskell - 如何在haskell中获取值类型

javascript - 如何扩充在 Typescript 模块上声明但未导出的类