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