我想知道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
中,我有:
在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自动完成中获益,而不必在自己的代码中重写每个方法。)
有人知道这是否可能吗?在
目前没有回答
相关问题 更多 >
编程相关推荐