我希望一个子类继承其父类返回的方法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
未绑定到任何具体类型。我现在有点迷茫,我没有找到任何办法让它工作......这甚至可能吗?