我遇到的情况是,一个类在协议的各个实现中都是通用的,而该协议本身具有通用的类型槽,而我找不到用Python类型提示(Mypy可以接受)表达这种方式。
具体地说,我有:
__A = TypeVar('__A', covariant=True)
class IndexableCollection(Protocol, Generic[__A]):
def __iter__(self) -> Iterator[__A]:
...
def __len__(self) -> int:
...
@overload
def __getitem__(self, key: int) -> __A:
...
@overload
def __getitem__(self, index: slice) -> Sequence[__A]:
...
现在,我想指定一个NamedTuple,其中成员被限制为上述协议。也许是这样的(这是不正确的,但是我找不到可以接受的变体):
Coll = TypeVar('Coll', bound=IndexableCollection)
class MyTuple(NamedTuple, Generic[Coll]):
sub_collection: Coll
...
理想情况下,我想将元素类型(协议中的通用参数)也用作元组的通用参数。
我需要这个的原因是,实际上,sub_collection
成员有时只是一个普通的旧List
,而有时可能是一个numpy数组。在使用numpy数组的情况下,绑定是已知的,我需要使用它(用于多维切片)。这意味着在元组定义本身中直接将类型os sub_collection
指定为IndexableCollection
(非一般而言)不够通用(无法捕获多维可分割性),因此我需要推送理想情况下将其转换为通用类型。
注意-当试图捕获一般类型的类型时,也会发生这种情况,并且可能归结为同一问题(???)