基于类属性的Python类型注释

时间:2019-09-03 18:37:32

标签: python-3.x

我有一个基类,它继承自Sequencecollections.abc)。我希望能够从基类继承,为不同类型的对象提供创建方法,并为__getitem____iter__设置类型注释,以便我的IDE(PyCharm)可以显示特定顺序中对象的类型。

我认为我可以通过重写类属性并在基类中基于该类属性定义类型注释来完成此操作。但是看起来类型注释没有考虑重写属性。

这是我想做的一个最小示例(使用原始类型):

from collections.abc import Sequence
from typing import Any
from typing import Iterable
from typing import Tuple
from typing import Type


class BaseFactory(Sequence):
    name: str = 'Base Factory'
    obj_type: Type = Any

    def create(self):
        raise NotImplementedError

    def __init__(self, *seq: obj_type):
        self.items: Tuple[BaseFactory.obj_type] = tuple(seq)

    def __getitem__(self, index: int) -> obj_type:
        return self.items[index]

    def __iter__(self) -> Iterable[obj_type]:
        return iter(self.items)

    def __len__(self) -> int:
        return len(self.items)


class IntFactory(BaseFactory):
    name = 'Int Factory'
    obj_type = int

    def create(self) -> obj_type:
        return 1


class FloatFactory(BaseFactory):
    name = 'Float Factory'
    obj_type = float

    def create(self) -> obj_type:
        return 1.0


if __name__ == '__main__':
    B = BaseFactory(1, 'string', 2.0)
    # Shows inferred type as `Any`
    any_obj = B[0]

    I = IntFactory(1, 2, 3)
    # Still shows inferred type as `Any`
    int_obj = I[0]

    F = FloatFactory(1.0, 2.0, 3.0)
    # Still shows inferred type as `Any`
    float_obj = F[0]

我可以通过完全重写子类中的__getitem____iter__并调用super来完成此操作,但是我的实际代码中有许多方法必须覆盖,因为许多子类,只是为了更改返回类型。

是否有更简单的方法为每个子类指定对象类型?

0 个答案:

没有答案