0

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

4

0 回答 0