"arg-type" typing error when using union of types, no error when type are used separately

Viewed 309

I would like to understand why the union of float and np.float64 types is producing an [arg-type] typing error here but using the types separately is fine:

import numpy as np
from numpy.typing import ArrayLike
from typing import Any, Union


def as_float_array(a: ArrayLike) -> Any:
    ...


w: float = float(4)
as_float_array([w])

x: np.float64 = np.float64(4)
as_float_array([x])

y: Union[float, np.float64] = float(4)
as_float_array([y])

z: Union[float, np.float64] = np.float64(4)
as_float_array([z])

/.../scratch.py:17: error: Argument 1 to "as_float_array" has incompatible type "List[Union[float, floating[_64Bit]]]"; expected "Union[Sequence[Sequence[Sequence[Sequence[Sequence[Any]]]]], Union[Union[_SupportsArray[dtype[Any]], Sequence[_SupportsArray[dtype[Any]]], Sequence[Sequence[_SupportsArray[dtype[Any]]]], Sequence[Sequence[Sequence[_SupportsArray[dtype[Any]]]]], Sequence[Sequence[Sequence[Sequence[_SupportsArray[dtype[Any]]]]]]], Union[bool, int, float, complex, str, bytes, Sequence[Union[bool, int, float, complex, str, bytes]], Sequence[Sequence[Union[bool, int, float, complex, str, bytes]]], Sequence[Sequence[Sequence[Union[bool, int, float, complex, str, bytes]]]], Sequence[Sequence[Sequence[Sequence[Union[bool, int, float, complex, str, bytes]]]]]]]]"
/.../scratch.py:20: error: Argument 1 to "as_float_array" has incompatible type "List[Union[float, floating[_64Bit]]]"; expected "Union[Sequence[Sequence[Sequence[Sequence[Sequence[Any]]]]], Union[Union[_SupportsArray[dtype[Any]], Sequence[_SupportsArray[dtype[Any]]], Sequence[Sequence[_SupportsArray[dtype[Any]]]], Sequence[Sequence[Sequence[_SupportsArray[dtype[Any]]]]], Sequence[Sequence[Sequence[Sequence[_SupportsArray[dtype[Any]]]]]]], Union[bool, int, float, complex, str, bytes, Sequence[Union[bool, int, float, complex, str, bytes]], Sequence[Sequence[Union[bool, int, float, complex, str, bytes]]], Sequence[Sequence[Sequence[Union[bool, int, float, complex, str, bytes]]]], Sequence[Sequence[Sequence[Sequence[Union[bool, int, float, complex, str, bytes]]]]]]]]"
Found 2 errors in 1 file (checked 1 source file)

Expected formatted:

Union[
    Sequence[Sequence[Sequence[Sequence[Sequence[Any]]]]],
    Union[
        Union[
            _SupportsArray[dtype[Any]],
            Sequence[_SupportsArray[dtype[Any]]],
            Sequence[Sequence[_SupportsArray[dtype[Any]]]],
            Sequence[Sequence[Sequence[_SupportsArray[dtype[Any]]]]],
            Sequence[Sequence[Sequence[Sequence[_SupportsArray[dtype[Any]]]]]]
        ],
        Union[
            bool, int, float, complex, str, bytes,
            Sequence[Union[bool, int, float, complex, str, bytes]],
            Sequence[Sequence[Union[bool, int, float, complex, str, bytes]]],
            Sequence[Sequence[Sequence[Union[bool, int, float, complex, str, bytes]]]],
            Sequence[Sequence[Sequence[Sequence[Union[bool, int, float, complex, str, bytes]]]]]
        ]
    ]
]

It is worth noting that defining a new type as follows removes the error:

import numpy as np
from numpy.typing import ArrayLike
from typing import Any, Sequence, Union

ArrayMostly = Union[ArrayLike, Sequence[Union[float, np.float64]]]


def as_float_array(a: ArrayMostly) -> Any:
    ...


x: Union[float, np.float64] = float(4)
as_float_array([x])
0 Answers
Related