gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:39:58 26 4
gpt4 key购买 nike

也许令我羞愧的是,我刚刚开始在我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com