键入用于isinstancecheck的注释

时间:2020-06-18 15:38:14

标签: python types typing pytype

我有一个看起来像这样的代码段:

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

0 个答案:

没有答案