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

Aju*_*rna 5 type-hinting python-3.x

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

def foo(i: int) -> Bar:
    class Bar:
        def __init__(i: int):
            self.i = i
    return Bar(i)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

注释是没有意义的,因为你的函数每次被调用时都会返回一个新的、不同的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)
Run Code Online (Sandbox Code Playgroud)

为了使这一点更可读,基类可能只是被命名Bar和功能可能产生一个BarImplConcreteBar或相似。这样你就可以Bar在任何地方继续使用类型注释来减少混淆。

您实际上似乎不需要每次都创建一个新类;类中的任何内容都没有参数化或使用闭包;如果这适用于您的实际代码,那么您可以在函数之外定义它:

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

def foo(i: int) -> Bar:
    return Bar(i)
Run Code Online (Sandbox Code Playgroud)