gpt4 book ai didi

python - 指定泛型集合中重写方法的类型提示

转载 作者:行者123 更新时间:2023-11-28 17:08:19 24 4
gpt4 key购买 nike

我定义了一个抽象基类 BaseRepository,它充当具有指定父类(super class)型 Foo 的项的集合。BaseRepository 中的便捷类方法被注释/类型提示以与类型为 Foo 的对象一起使用。这是一个最小的例子:

from abc import ABCMeta, abstractmethod
NoReturn = None

class Foo(object):
pass # simple data holding object


class BaseRepository(object, metaclass=ABCMeta):

# May be filled with subtypes of `Foo` later
_items = None # type: List[Foo]

@classmethod
def get_item(cls) -> Foo:
return cls._items[0]

@classmethod
@abstractmethod
def _load_items(cls) -> NoReturn:
pass

现在有多个静态实现(例如 SubRepository),每个静态实现都应该使用它们自己的项目类型(例如 Bar),它们是原始泛型的子类输入 Foo

class Bar(Foo):
pass # Must implement Foo in order for BaseRepository's methods to work

def load_some_bars():
return [Bar(),Bar()]

class SubRepository(BaseRepository):
# Inherits `get_item` from BaseRepository

@classmethod
def _load_items(cls) -> NoReturn:
cls._items = load_some_bars()

存储库是静态的,这意味着它们没有被实例化,而是充当命名空间,以便正确访问我从 YAML 配置文件加载的项目。主要好处是我可以创建其中一个 SubRepositories 并简单地覆盖反序列化方法 _load_items,生成的存储库将具有基类中的所有便捷方法。因为我需要确保所有这些 SubRepositories 都与具有特定接口(interface)的项目 Foo 一起工作,以便 BaseRepository 方法正常运行,所以SubRepositories 必须使用从 Foo 继承的项目。

Java 或 C# 等强类型语言具有通用集合 的概念,其中子类集合中的元素都采用特定类型。Python 中的类型提示是否可能相同?特别是,我希望以最小的努力将 SubRepository 中继承的 get_item 方法提示为 Bar(不要仅仅为了输入提示)。最理想的情况是,正确的返回值应该由 PyCharm 检查。

目前,尽管 SubRepository 包含 Bar 项,但我在 PyCharm 中的自动完成功能只显示了 Foo 的成员。

我阅读了有关 typing.GenericTypeVar 的内容,但我不确定在这种情况下如何使用它们。

最佳答案

您正在针对接口(interface)进行编程,因此只有 Foo 成员公开。

from typing import get_type_hints
print(get_type_hints(SubRepository.get_item))

输出:

{'return': <class '__main__.Foo'>}

泛型集合将公开泛型类型的成员。

from typing import TypeVar, Generic, get_type_hints
from abc import ABCMeta, abstractmethod
NoReturn = None

# type variable with an upper bound
T = TypeVar('T', bound=Foo)

class BaseRepository(Generic[T], metaclass=ABCMeta):
_items = None # type: List[T]

@classmethod
def get_item(cls) -> T:
return cls._items[0]

@classmethod
@abstractmethod
def _load_items(cls) -> NoReturn:
pass

class SubRepository(BaseRepository[Bar]):
# Inherits `get_item` from BaseRepository

@classmethod
def _load_items(cls) -> NoReturn:
cls._items = load_some_bars()

返回类型

print(get_type_hints(SubRepository.get_item))

推卸责任

{'return': ~T}

自动完成现在将显示 Bar 的成员。

关于python - 指定泛型集合中重写方法的类型提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49583643/

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