如何在下面的action
方法中更改注释,以确保View
和Action
都是从Table
继承的同一类的内部类? >
from __future__ import annotations
class Player:
def action(self, table_view: Table.View) -> Table.Action:
...
class Table:
class View:
...
class Action:
...
例如,如果我将创建一个子类class LimitTable(Table)
并将LimitTable.View
的实例作为参数传递给action
方法,我想确保返回类型也将是{ {1}}。
我知道我应该以某种方式使用LimitTable.Action
,但是在阅读了python文档和相应的PEP并在此处浏览了有关它的所有问题之后,我仍然不知道该怎么做。
答案 0 :(得分:1)
最接近的是定义一个以T
为边界的类型变量Table
:
T = TypeVar('T', bounded=Table)
并在您的类型提示中使用它代替Table
:
class Player:
def action(self, table_view: T.View) -> T.Action:
...
但是,这不会阻止action
以Table.View
作为参数并返回LimitedTable.Action
;这是一个已知问题,已在PEP-484中得到确认:
不幸的是,要解决这个问题,就需要引入一个更强大,也更复杂的概念,即F界多态性。我们将来可能会重新讨论。
另一个问题(我想您已经解决了,但值得指出)是,在给定Table.View
实例的情况下,您仍然需要某种方法来识别正确的Action
类返回类型。您没有可用的Table
实例,因此可以使用类似type(table_view).Action
的东西。