2016-10-20 135 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遇到它時立即執行。首次導入時會執行模塊,然後將結果的類對象存儲在全局級別。在這裏你將它創建爲一個函數中的局部變量,並且每次調用該函數時都會執行它。 –