типизация Python: как наследовать собственный тип (со статической типизацией) - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу, чтобы дочерний класс наследовал методы его родителей, которые возвращают self.При этом средство проверки типов (mypy) по умолчанию сохраняет возвращаемый тип в родительском классе.Я хочу, чтобы он автоматически выводил дочерний класс в качестве возвращаемого типа.Для простых случаев я нашел следующий код для работы:

import typing

Self = typing.TypeVar("Self", bound="Foo")

class Foo:
    def foo(self) -> "Foo":
        return self

    def bar(self: Self) -> Self:
        return self

class Bar(Foo):
    ...

# The naive implementation reports the type as "Foo".
# This is not what I want
reveal_type(Bar().foo())

# Using a generic `Self` type seems to work for simple cases
# Revealed type is 'Bar*'
reveal_type(Bar().bar())

Это «решение» не работает, если я пытаюсь использовать менеджер контекста:

import contextlib
import typing

Self = typing.TypeVar("Self")

class Foo(typing.ContextManager):
    def __enter__(self: Self) -> Self:
        return self

class Bar(Foo):
    ...

with Bar() as f:
    # Revealed type is 'Bar*'
    reveal_type(f)

with contextlib.ExitStack() as cx:
    f2 = cx.enter_context(Bar())
    # Revealed type is 'Any'
    reveal_type(f2)

Это работает в первомдело но не во втором.Я думаю, что это потому, что я не указал параметр типа typing.ContextManager.Однако, если я это сделаю, mypy обнаружит оба типа как Any:

class Foo(typing.ContextManager[Self]):
    def __enter__(self: Self) -> Self:
        return self

Насколько я понимаю, это происходит потому, что Self не привязан ни к какому конкретному типу на данный момент.Я сейчас немного потерялся, я не нашел способа заставить его работать ... Это вообще возможно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...