Как аннотировать возвращаемый тип функции python точно так же, как один из аргументов? - PullRequest
1 голос
/ 04 июля 2019

Как изменить аннотации в методе 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, я хочу убедиться, что тип возвращаемого значения также будет LimitTable.Action.

Я знаю, что должен каким-то образом использовать typing.TypeVar, но после прочтения документации по Python и соответствующих PEP и просмотра всех вопросов по этому поводу, я все еще не знаю, как это сделать.

1 Ответ

1 голос
/ 04 июля 2019

Самое близкое, что вы можете получить, это определить переменную типа 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.

...