Python 类型:从返回 Union 的函数缩小类型

问题描述 投票:0回答:1

我很难找到满足 mypy

返回类型
。我有两个功能。第一个返回
Union
类型,因为该类型取决于赋予函数的参数。第二个函数使用默认参数调用第一个函数。因此,该类型不是
Union
类型——它可以缩小为
Union
中的类型之一。

让我给你举一个我的问题的一个非常简单的例子:

from typing import Union


def first(as_string: bool) -> Union[str, int]:
    if as_string:
        return "42"
    else:
        return 42


def second(as_string: bool) -> str:
    return first(True)

这会导致错误:

Incompatible return value type (got "str", expected "Union[str, int]")

如何在仍然使用类型提示的同时防止

mypy
抛出错误?

如果您想建议拆分第一个函数,请记住这只是一个简化。我的(第一个)函数接收一个函数(

sklearn.metrics
函数)并且大多数时候会返回一个标量。仅当应用混淆矩阵时,类型才会发生变化。第一个函数进行一些预处理,然后应用度量。我只是想为混淆矩阵有一个不同命名的函数,因为我认为它是度量的特殊情况。

python python-typing mypy
1个回答
16
投票

mypy
无法推断参数类型和返回值类型之间的关系。

您有两个选择:

  1. 使用

    assert
    确保类型正确:

    def second(as_string) -> str:
        ret = first(True)
        assert isinstance(ret, str)
        return ret
    
  2. 您可以使用

    typing.cast
    向类型检查器断言,而不改变运行时行为(即不引入
    AssertionError
    引发的可能性)。

    from typing import cast
    
    def second(as_string) -> str:
        return cast(str, first(True))
    
© www.soinside.com 2019 - 2024. All rights reserved.