Python类型提示在函数中返回类

时间:2016-10-20 08:54:06

标签: python-3.x type-hinting

我有类似下面的功能。我希望类型提示返回Bar但这似乎无效。有没有办法做到这一点,还是我必须在函数外部移动类以将其作为返回类型引用?

def foo(i: int) -> Bar:
    class Bar:
        def __init__(i: int):
            self.i = i
    return Bar(i)

1 个答案:

答案 0 :(得分:3)

注释没有意义,因为每次调用时,函数都会返回新的,不同的Bar的实例。

换句话说,没有一个 Bar类可以检查类型。 type(foo(1)) is type(foo(2))的结果总是为假,因此当您传入type(foo(1))时,对foo(2)的类型检查总是会失败。

如果您希望在此处应用类型检查,则需要声明基类:

class BaseBar: pass

def foo(i: int) -> BaseBar:
    class Bar(BaseBar):
        def __init__(i: int):
            self.i = i
    return Bar(i)

为了使其更具可读性,基类可以命名为Bar,该函数可以生成BarImplConcreteBar或类似的。这样,您可以在任何地方继续使用Bar类型注释来减少混淆。

实际上,您似乎需要每次创建新课程;类中没有任何参数化或使用闭包;如果这对于您的实际代码是正确的,那么您可以在外部函数中定义它:

class Bar:
    def __init__(i: int):
        self.i = i

def foo(i: int) -> Bar:
    return Bar(i)