python类型:如何继承自类型(使用静态类型)

时间:2018-12-11 14:05:09

标签: python-3.x generics typing mypy

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

0 个答案:

没有答案