如何键入在函数的局部范围内定义的 return 值?

How to type hint a return value that's defined in the function's local scope?

给定以下示例:

class A:
    def __init__(self, num: int):
        self.num = num

    def bar(self, eggs: int):
        if eggs == self.num:
            raise ValueError


def foo(spam: bool) -> B:
    class B(A):
        def bar(self, eggs: int):
            try:
                super().bar(eggs)
            except ValueError as e:
                if not spam:
                    raise e
    return B

基础 class A 有一个名为 bar 的方法,它在 eggs 等于 self.num 时引发 ValueError。我还有一个名为 foo 的函数,它接受一个参数 spam,它 return 是 A 的子 class 并覆盖 bar 方法,所以如果 spam 不是 Falsey,则不会引发 ValueError

我正在尝试键入提示 foo 函数的 return 值。如果我做 -> BB 是未定义的。如果我这样做 -> A,则类型 B 不完全是 A。如果我使用 future hinting -> "B"B 仍未定义,因为它在本地范围内。

有什么提示吗?如果没有,有没有更好的方法重写我的代码?

以下是我快速浏览文档后想到的内容。这根本不是一个好的解决方案(我认为),但它应该可以为您完成工作。

有一个叫做 typing.TypeVar (docs) 的东西。它基本上是一个通用类型。所以你可以做的是:

在全局层面(定义class A后)定义:

from typing import TypeVar
B = TypeVar('B', bound=A)

现在在 def foo 的函数签名中你可以说:

def foo(spam: bool) -> B:

然后在函数里面你可以继续新建一个名字为B的class和return它

我什至不确定这是否在所有情况下都能正常工作。如果您发现它有任何问题,请务必纠正我并在此处 post。