如何键入提示在函数的本地范围中定义的返回值?

时间:2018-06-15 00:29:16

标签: python python-3.x factory type-hinting typing

给出以下示例:

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

基类A有一个名为bar的方法,如果ValueError等于eggs,则会引发self.num。我还有一个名为foo的函数接受参数spam,它返回A的子类并覆盖bar方法,这样就不会ValueError如果spam非虚假则提出。

我正在尝试输入提示foo函数的返回值。如果我执行-> B,则B未定义。如果我-> A,则B类型不完全是A。如果我执行-> "B",则使用将来的提示,B仍未定义,因为它位于本地范围内。

无论如何都要输入提示吗?如果没有,是否有更好的方法来重写我的代码?

1 个答案:

答案 0 :(得分:0)

这是我从快速扫描文档中可以想到的。这根本不是一个好的解决方案(我认为),但它应该为你做好。

有一种称为typing.TypeVardocs)的东西。它基本上是通用类型。所以你可能做的是:

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

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

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

def foo(spam: bool) -> B:

然后在函数内部,您可以继续创建一个名为B的新类并将其返回。

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