gpt4 book ai didi

python - 用户定义的通用类型和 collections.abc

转载 作者:太空狗 更新时间:2023-10-29 18:12:45 25 4
gpt4 key购买 nike

我有一个 Python 包,它根据 collections.abc 提供的 ABC(MappingSequence 等)定义了各种集合).我想利用 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 中的所有混合方法。我可以自己处理实现它们,但这首先会破坏使用 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 声明自定义泛型类型的首选方法是什么?

最佳答案

[ Personal Opinion™ ]:我真的不支持创建新的 typing 功能。这些应该足够通用,不需要对您的代码进行任何修改。如果您的映射类非常复杂,无法用任何通用映射(如 dict)代替,您最好只使用它自己:

def foo(bar: MyMapping) -> List:
pass

代替

def foo(bar: Mapping[K, V]) -> List:
pass

现在,如果您希望您的用户能够使用 typing.Mapping“输入”检查您的类,您只需继承 collections.Mapping

class MyMapping(collections.abc.Mapping):
... # define required methods

isinstance(MyMapping(), typing.Mapping[K, V]) # --> True

关于python - 用户定义的通用类型和 collections.abc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33119282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com