2016-08-18 89 views
0

請考慮這個片段的蟒蛇3.5代碼:如何註釋返回一個特定類型的方法(或亞型)

class Foo: 
    pass 

class Bar(Foo): 
    pass 

class AbstractSomething: 

    def get_foobinator_type(self): 
     return Foo 

我想註釋(using PEP-0484 annotationsget_foobinator_type方法的返回值說: 「它返回一個類型,即Foo或其任何子類型」。

我沒有找到任何明智的方式在Python中做到這一點。下面是明顯錯誤的做法:

  • 以下:def get_foobinator_type(self) -> Foo意味着這個方法返回一個實例Foo

  • 以下內容:def get_foobinator_type(self) -> type意味着此方法返回一個類型,但遺憾的是,沒有關於這需要是Foo的子類型的信息。

以Java術語來說,我想要有像這樣的簽名的方法:Class<Foo> getFoobinatorType()

回答

0

最近(在Python 3.5.2)的通用Type被引入,所以解決方法是:

class AbstractSomething: 

    def get_foobinator_type(self) -> typing.Type[Foo]: 
     return Bar 

參見:python docs

0

我想你需要的是打字模塊中的TypeVar。

from typing import TypeVar 

class Foo: 
    pass 

class Bar(Foo): 
    pass 

T = TypeVar('T', bound=Foo) 

class AbstractSomething: 

    def get_foobinator_type(self) -> T: 
     return Foo 

From the documentation of typing

可替代地,一種類型的可變可以指定使用 綁定=上限。這意味着實際類型取代(明確 或隱含的)該類型變量必須 邊界類型的子類,見PEP 484

1

據我瞭解,你真的不能。您正在尋找一種方法來指示類型類型;根據類的類型來檢查,即它的元類。

問題在於元類無法幫助類型檢查器評估對象的繼承可能是什麼,如果它的類型爲type就沒關係。

除此之外,並且不確定您使用的是什麼類型檢查程序,例如mypy用於定製元類,您可以使用這些定製元類將對象分組到更自定義的組中。

我看到它的方式,你要麼根本不註釋,要麼改變實現並用Foo註釋。

+0

我強烈懷疑是這樣。我不使用靜態類型檢查器,我主要使用類型提示來記錄API並更好地完成代碼完成。 –

相關問題