我有一个看起来像这样的代码段:
T = TypeVar('T')
def filter_by_type(cls: Type[T]) -> Iterable[T]:
for val in some_other_iterable():
if isinstance(val, cls):
yield val
到目前为止一切顺利。但是现在我意识到,我不仅可以通过一个类,而且可以通过一个元组类。未类型化的Python代码本身甚至不需要任何更改,因为isinstance
确实接受了元组作为第二个参数。但是类型注释现在变得非常困难。本质上我想要这样:
def filter_by_type(cls: Tuple[Type[T1], Type[T2], ...]]) -> Iterable[Union[T1, T2, ...]]:
理想情况下,除了原始版本外,我还会有上述内容,我相信我可以为此使用@overload。
我知道使用Tuple[T, ...]
来表示具有未知数量的元素(都是T
类型)的元组是possible,但是我无法想象这会合理地扩展就像我这样,其中列出了多个显式元素。
我怀疑pytype系统是否可以指定我想要的所有内容。我能得到的最近的是什么?到目前为止,我最好的方法是固定数量的类型的重载。
T1 = TypeVar('T1')
T2 = TypeVar('T2')
T3 = TypeVar('T3')
@overload
def filter_by_type(cls: Type[T1]) -> Iterable[T1]: ...
@overload
def filter_by_type(cls: Tuple[Type[T1]]) -> Iterable[T1]: ...
@overload
def filter_by_type(cls: Tuple[Type[T1], Type[T2]]) -> Iterable[Union[T1, T2]]: ...
@overload
def filter_by_type(cls: Tuple[Type[T1], Type[T2], Type[T3]]) -> Iterable[Union[T1, T2, T3]]: ...
def filter_by_type(cls):
for val in some_other_iterable():
if isinstance(val, cls):
yield val