1
我有一个类似于下面的函数。我希望类型提示返回Bar,但这似乎是无效的。有没有办法做到这一点,或者我必须将该类移到函数外部以将其引用为返回类型?Python类型暗示函数返回类
def foo(i: int) -> Bar:
class Bar:
def __init__(i: int):
self.i = i
return Bar(i)
我有一个类似于下面的函数。我希望类型提示返回Bar,但这似乎是无效的。有没有办法做到这一点,或者我必须将该类移到函数外部以将其引用为返回类型?Python类型暗示函数返回类
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)
它甚至都没有发生,我认为我是每次创建一个新类。我只是想尽量避免名称空间混乱,但如果这是正确的,我会从其他地方移动课程并从那里调用它来获得更好的性能。 – Ajurna
@Ajurna:绝对。 'class ...:'语句是*可执行语句*。它在Python遇到它时立即执行。首次导入时会执行模块,然后将结果的类对象存储在全局级别。在这里你将它创建为一个函数中的局部变量,并且每次调用该函数时都会执行它。 –