如何使以序列作为输入的函数的返回类型取决于该序列类型?

时间:2019-12-21 11:12:42

标签: python type-hinting mypy

我正在研究能够执行SNMP设置操作的库。有一个具有如下特征的函数:

def multiset(ip: str, community: str, oids: List[str], values: List[SnmpValue]) -> List[SnmpValue]:
   ...

这是对真实签名的略微改动,以更好地说明打字问题。在正常操作下,该函数将返回设置为相同类型列表的值。在此示例中,该示例看起来很多余,但是在实际代码中,有一个用例(错误检测),但这会使此键入问题变得有些复杂。

核心是我有一个函数,该函数接受值的序列并返回相同类型的序列。这些类型仅在调用该函数的行上真正可见。

另一种说明方法是下面的代码示例:

from typing import Generic, TypeVar, Union, List


TSupportedTypes = Union[int, str]
T = TypeVar('T', bound=TSupportedTypes)


class Wrapper(Generic[T]):

    def __init__(self, value: T) -> None:
        self.value = value



def process(data: List[Wrapper[TSupportedTypes]]) -> List[TSupportedTypes]:
    output = []
    for item in data:
        output.append(item.value)
    return output


processed = process([Wrapper(1), Wrapper('foo')])

# Is it possible to make this work without an "isinstance" check?
processed[1].startswith('f')

最后一次,类型检查器仅知道列表中的每个值都是intstr。在这种情况下,仅在调用process时才知道类型。

在上述情况下,类型检查器抱怨int没有属性startswith,但是代码仍然可以工作。

有没有一种方法可以告诉类型检查器从process函数返回的内容与输入的内容相同?

目前,我使用了一些健康的Any提示,但这使代码中的大部分类型检查失败了,我真的很想知道这是否可行。

0 个答案:

没有答案