1 个回答

1

这个类型检查器不知道传入的是A还是B,所以它不能更具体地确定a()的类型,只能说是A|B。因此,列表的类型是list[A|B],而不是list[A] | list[B]

你应该定义一个带有限制类型变量的通用函数。

from typing import TypeVar


T = TypeVar('T', A, B)


def f(items, t: type[T]) -> list[T]:
    return [t() for x in items]

从类型检查器的角度来看,你现在定义了两个函数,一个类型是Callable[[Any, Type[A]], list[A]],另一个类型是Callable[[Any, Type[B]], list[B]],而不是一个类型是Callable[[Any, Type[A]|Type[B]], list[A]|list[B]]的单一函数。参数t的类型实际上会决定调用哪一个函数,并且应该进行类型检查:

f(something, A)  # call the Callable[[Any, Type[A]], list[A]] version
f(something, B)  # call the Callable[[Any, Type[B]], list[B]] version

撰写回答