我有类似下面的功能。我希望类型提示返回Bar但这似乎无效。有没有办法做到这一点,还是我必须在函数外部移动类以将其作为返回类型引用?
def foo(i: int) -> Bar:
class Bar:
def __init__(i: int):
self.i = i
return Bar(i)
答案 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
,该函数可以生成BarImpl
或ConcreteBar
或类似的。这样,您可以在任何地方继续使用Bar
类型注释来减少混淆。
实际上,您似乎需要每次创建新课程;类中没有任何参数化或使用闭包;如果这对于您的实际代码是正确的,那么您可以在外部函数中定义它:
class Bar:
def __init__(i: int):
self.i = i
def foo(i: int) -> Bar:
return Bar(i)