2016-10-20 105 views
1

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

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

回答

3

的注解是没有意义的,因为你的函数返回一个新的,不同的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和功能,可以产生BarImplConcreteBar或类似的。这样你就可以继续使用Bar类型注释来减少混淆。

你实际上并不认为需要每次创建一个新类;课堂中没有任何内容被参数化或使用闭包;如果这是你的实际代码属实,那么你可以只把它定义功能:

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

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

它甚至都没有发生,我认为我是每次创建一个新类。我只是想尽量避免名称空间混乱,但如果这是正确的,我会从其他地方移动课程并从那里调用它来获得更好的性能。 – Ajurna

+0

@Ajurna:绝对。 'class ...:'语句是*可执行语句*。它在Python遇到它时立即执行。首次导入时会执行模块,然后将结果的类对象存储在全局级别。在这里你将它创建为一个函数中的局部变量,并且每次调用该函数时都会执行它。 –