Python 类型:如何断言值具有类型联合中的哪种类型?

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

简而言之,我有一个返回 int 或 float 的函数。然后调用者函数检查第一个函数的返回类型,如果是 float,则返回 -1,否则返回原始值,因为它必须是 int。

# pseudo code for the aforementioned 

def f1(*args, **kwargs) -> int | float: ... 

def f2(*args, **kwargs) -> int:
    ans = f1(...)
    if type(ans) == float:
        return -1
    return ans  # the idea here is that if f1 does not return float, it must return an int which is a valid return for f2

我的静态检查器失败并出现以下错误

Expression of type "int | float" cannot be assigned to return type "int"
  Type "int | float" cannot be assigned to type "int"
    "float" is incompatible with "int"

错误信息非常简单,f1 返回 int 或 float,因为 f2 期望返回 int,所以不能直接返回 f1 的结果。然而,(理想情况下)我的 if 语句可以防止 f1 结果为浮点数的可能性。

有谁知道更好的方法来注释以下内容。我目前正在使用 type:ignore 标志,但我希望不使用此解决方法。

python annotations mypy
2个回答
1
投票

您需要与

isinstance
核实:

def f1(*args, **kwargs) -> int | float: ... 

def f2(*args, **kwargs) -> int:
    ans = f1(...)
    if isinstance(ans, float):
        return -1
    # now the typechecker can infer the type of 'ans' as int
    return ans 

更多信息参见 Mypy 文档


0
投票

您可以使用类型转换来向类型检查器断言该值确实属于特定类型:

import typing

def f1(*args, **kwargs) -> int | float: ... 

def f2(*args, **kwargs) -> int:
    ans = f1(...)
    if type(ans) == float:
        return -1
    return typing.cast(int, ans)
© www.soinside.com 2019 - 2024. All rights reserved.