首页 > 解决方案 > 缩小函数内部参数的联合类型

问题描述

我有一个接受参数的函数,该参数可以是 A 或 B 类型。如果传递了 A,则将其转换为 B 以便在内部进行进一步处理。

为简单起见,请考虑以下使用 int/float 的示例来说明场景:

import typing


def foo(x: typing.Union[int, float]):
    if type(x) is int:
        x = float(x)

    x.as_integer_ratio()  # method of float that does not exist for int

最后一行导致 mypy 错误:

错误:“Union[int, float]”的项目“int”没有属性“as_integer_ratio”

有没有一种很好的方法可以让 mypy 清楚,在if类型x基本上从 Union 更改为始终为 float 而不添加额外变量之后?

标签: pythontype-hintingmypy

解决方案


您应该将您的if声明更改为:

if isinstance(x, int):

这条线由 mypy 更好地处理,现在在执行之后ifx = float(x)它知道 x 不能是 int 并且错误消失了。


推荐阅读