我正在研究能够执行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')
最后一次,类型检查器仅知道列表中的每个值都是int
或str
。在这种情况下,仅在调用process
时才知道类型。
在上述情况下,类型检查器抱怨int
没有属性startswith
,但是代码仍然可以工作。
有没有一种方法可以告诉类型检查器从process
函数返回的内容与输入的内容相同?
目前,我使用了一些健康的Any
提示,但这使代码中的大部分类型检查失败了,我真的很想知道这是否可行。