我希望子类继承其父类的方法,这些方法返回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
目前尚未绑定到任何具体类型。我现在有点迷茫,我找不到任何使它工作的方法……这甚至有可能吗?