Я хочу, чтобы дочерний класс наследовал методы его родителей, которые возвращают 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
не привязан ни к какому конкретному типу на данный момент.Я сейчас немного потерялся, я не нашел способа заставить его работать ... Это вообще возможно?