如何在python中向自定义dict子类添加类型注释?

2024-09-30 14:34:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个自定义的dict子类,它类似于defaultdict,但将缺少的键传递给default_factory,这样它就可以生成一个适当的值

class KeyDefaultDict(dict):
    __slots__ = ("default_factory",)

    def __init__(self, default_factory, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.default_factory = default_factory

    def __missing__(self, key):
        if self.default_factory is None:
            raise KeyError(key)
        ret = self[key] = self.default_factory(key)
        return ret

    def __repr__(self):
        return (
            f"{type(self).__name__}({repr(self.default_factory)}, {super().__repr__()})"
        )


d = KeyDefaultDict(int)
print(d["1"] + d["2"] + d["3"])  # out: 6
print(d)  # out: KeyDefaultDict(<class 'int'>, {'1': 1, '2': 2, '3': 3})

我想像我项目的其他部分一样为这个类添加类型注释,但是我找不到任何这样做的例子。 我看到typing模块使用外部类来添加注释。例如,defaultdict将用定义为class typing.DefaultDict(collections.defaultdict, MutableMapping[KT, VT])typing.DefaultDict进行注释

所以它是一个外部类,子类defaultdict和泛型typing.MutableMapping。 然而,我认为他们这样做可能是因为他们不想改变原来的collections.defaultdict。我找到了GenericMapping的子类的例子,但没有从dict这样的其他类继承的类

问题是:如何为这个类添加类型注释以使其成为泛型类? 我需要扩展其他东西还是为注释创建一个外部类

我使用的是python3.7.5,我更喜欢直接从dict继承,因此我不必实现所需的方法,也不必考虑性能问题

提前谢谢


Tags: keyselfdefaulttypinginitfactorydefargs