如何注释python函数的返回类型与参数之一完全相同?

时间:2019-07-04 16:47:39

标签: python python-typing

如何在下面的action方法中更改注释,以确保ViewAction都是从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并在此处浏览了有关它的所有问题之后,我仍然不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

最接近的是定义一个以T为边界的类型变量Table

T = TypeVar('T', bounded=Table)

并在您的类型提示中使用它代替Table

class Player:
    def action(self, table_view: T.View) -> T.Action:
        ...

但是,这不会阻止actionTable.View作为参数并返回LimitedTable.Action;这是一个已知问题,已在PEP-484中得到确认:

  

不幸的是,要解决这个问题,就需要引入一个更强大,也更复杂的概念,即F界多态性。我们将来可能会重新讨论。

另一个问题(我想您已经解决了,但值得指出)是,在给定Table.View实例的情况下,您仍然需要某种方法来识别正确的Action类返回类型。您没有可用的Table实例,因此可以使用类似type(table_view).Action的东西。