Python3.5类型暗示允许协变返回类型吗?

2024-05-15 06:12:23 发布

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

我想知道python3.5类型暗示(the typing模块)是否支持返回类型协方差,主要用于PyCharm的自动完成。在

以下是我的运动框架的基类:

class BaseLeague:
    def get_teams(self) -> List[BaseTeam]:
        ...

    ...

class BaseTeam:
    def get_captain(self) -> BasePlayer:
        ...    

    def get_players(self) -> List[BasePlayer]:
        ...

    ...

class BasePlayer:
    team = None # type: BaseTeam

    ...

(我遗漏了很多方法,比如BaseLeague返回BaseTeam/BasePlayer/BaseLeague对象的方法,等等)

我有多个模块并行地对这3个类进行子类化,并添加/重写方法和属性。在

hockey/models.py中,我有:

^{pr2}$

football/models.py中,我有同样的事情:

class League(BaseLeague):
    ....

class Team(BaseTeam):
    ...

class Player(BasePlayer):
    ...

(我有20多项其他运动,如足球、棒球等)

在PyCharm中,当我在football.models.Team和类型self.get_captain().时,PyCharm显示基类BasePlayer的属性,但我希望它显示子类football.models.Player的属性。这似乎与return type covariance密切相关。在

我觉得我需要像这样使用Generic和{}:

Player = TypeVar('Player', covariant=True)
Team = TypeVar('Team', covariant=True)
League = TypeVar('League', covariant=True)

class BaseTeam(Generic[Player, Team, League]):
    def get_players(self) -> List[Player]:
        ...

然后在football.models中,我会做一些类似的事情:

class Team(BaseTeam[Player, Team, League]):

…其中Player,Team,League是对同一模块中的子类的引用。在

但它不起作用(PyCharm根本不显示任何自动完成),而且我不确定我是否使用了正确的语法。在

我想让它正常工作,因为我的基类是框架API的一部分,我的用户将它们子类化数百次,所以我希望他们能从PyCharm自动完成中获益,而不必在自己的代码中重写每个方法。)

有人知道这是否可能吗?在


Tags: 方法self类型getmodelsdefteamclass

热门问题