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