【发布时间】:2017-04-02 06:37:11
【问题描述】:
我有一个类似于下面的功能。我希望类型提示返回 Bar 但这似乎是无效的。有没有办法做到这一点,还是我必须将类移到函数之外才能将其作为返回类型引用?
def foo(i: int) -> Bar:
class Bar:
def __init__(i: int):
self.i = i
return Bar(i)
【问题讨论】:
我有一个类似于下面的功能。我希望类型提示返回 Bar 但这似乎是无效的。有没有办法做到这一点,还是我必须将类移到函数之外才能将其作为返回类型引用?
def foo(i: int) -> Bar:
class Bar:
def __init__(i: int):
self.i = i
return Bar(i)
【问题讨论】:
注释没有意义,因为您的函数每次调用时都会返回一个不同的新Bar 类的实例。
换句话说,没有一个 Bar 类可供您检查类型。 type(foo(1)) is type(foo(2)) 的结果总是错误的,所以当你传入 foo(2) 时,对 type(foo(1)) 的类型检查总是会失败。
如果你想在这里应用类型检查,你需要声明一个基类:
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)
【讨论】:
class ...: 语句是一个可执行语句。它在 Python 遇到它时立即执行。模块在首次导入时执行,然后将生成的类对象存储在全局级别。这里你将它创建为函数中的局部变量,每次调用函数时都会执行。