【发布时间】:2016-01-12 04:25:46
【问题描述】:
我有一个 Python 包,它基于 collections.abc 提供的 ABC(Mapping、Sequence 等)定义了各种集合)。我想利用 Python 3.5 中引入的类型提示功能,但我怀疑最好的方法是什么。
让我们以其中一个类为例;直到现在,我有一些东西 类似这样:
from collections.abc import Mapping
class MyMapping(Mapping):
...
要将其转换为泛型类型,documentation 建议执行以下操作:
from typing import TypeVar, Hashable, Mapping
K = TypeVar("K", bound=Hashable)
V = TypeVar("V")
class MyMapping(Mapping[K, V]):
...
但这带来了两个问题:
该类丢失了 collections.abc.Mapping 中的所有 mixin 方法。我可以自己实现它们,但这会破坏首先使用 ABC 的部分目的。
isinstance(MyMapping(), collections.abc.Mapping)返回 False。此外,尝试调用collections.abc.Mapping.register(MyMapping)来解决此问题会引发 RuntimeError(“拒绝创建继承循环”)。
我第一次尝试解决这些问题是回到扩展collections.abc.Mapping:
from typing import TypeVar, Hashable
from collections.abc import Mapping
K = TypeVar("K", bound=Hashable)
V = TypeVar("V")
class MyMapping(Mapping[K, V]):
...
但这不起作用,因为 collections.abc.Mapping 不是泛型类型并且不支持订阅运算符。所以我尝试了这个:
from typing import TypeVar, Hashable, Mapping
from collections.abc import Mapping as MappingABC
K = TypeVar("K", bound=Hashable)
V = TypeVar("V")
class MyMapping(MappingABC, Mapping[K, V]):
...
但这闻起来很腥。导入和别名比较麻烦,生成的类有曲折的MRO,ABC提供的mix-in方法不会有打字信息……
那么,基于集合 ABC 声明自定义泛型类型的首选方式是什么?
【问题讨论】:
标签: python python-3.x generics type-hinting