2011-11-09 68 views
12

我有文檔在我身上膨脹,因爲任何時候我遇到一個複雜的鴨型,我需要某種方式來說「這個鴨型」,而是陷入了無盡的循環「你的功能需要這個輸入,但不記錄它「,然後記錄下來。這導致臃腫,重複的文檔,如下面的:如何記錄鴨子類型?

def Foo(arg): 
    """ 
    Args: 
     arg: An object that supports X functionality, and Y functionality, 
     and can be passed to Z other functionality. 
    """ 
    # Insert code here. 

def Bar(arg): 
    """ 
    Args: 
     arg: An object that supports X functionality, and Y functionality, 
     and can be passed to Z other functionality. 
    """ 
    # Insert code here. 

等等,等等,爲BazQux等功能。我需要一些簡短的寫作方式「arg是一種(對象類型)」。

對於某些鴨子類型,它就像「類似於字典的對象」一樣簡單:我們知道我們對字典的期望,所以我們知道要傳遞什麼。 A dict,或者可以模仿它的東西。

我覺得C++與模板類型有同樣的問題。 Haskell會擁有它,但可以使用類型的定義來記錄它。 (注意:Haskell類!= Java/C++/Python /等中的類)(注意:我沒有真正在Haskell中編程,所以請原諒我,如果它是一個蹩腳的例子。)

我應該去傳統OO路由,只需編寫一個基類,然後在文檔中說出「類似於此基類的任何東西」?該代碼不會強制從基類派生(因爲不需要從中派生對象),基本類除了記錄接口的屬性外基本上不添加任何值。

另一方面,我正在編程Python,並嘗試在一種語言的成語中進行編程。 (因爲這樣做通常會受到傷害。)基類對於繼承功能很有用,但是當你的基類完全抽象時,它似乎並沒有增加鴨類型語言的價值。


編輯:要的答案:我知道什麼鴨子類型是(應該是從後明顯)。我在哪裏證明這是一個問題,尤其是,當不存在將文檔附加到的類時。

+0

我喜歡「像行爲」,並保持記錄的要求,一般的,除非有特殊原因,揭露更多的細節。例如,如果只需要索引器和計數器,我仍然會說「像列表一樣行事」。對於其他類型,它是一樣的:「x就像動物一樣」,大概是「狗是動物」的想法在其他地方被記錄/保證。 – 2011-11-09 02:20:13

+0

@pst:是的,但什麼是動物,我們對動物的期望是什麼,我們在哪裏記錄它? – Thanatos

+3

'類Animal'和'類Dog'的地方,有自己的文檔:) Python是非常植根於類實例模型。 – 2011-11-09 02:23:34

回答

6

鴨子打字背後的想法是,你記錄你期待一隻鴨子,它是由其他對象來僞裝成一隻鴨子。

在文檔中沒有任何API指定它接受StringIO對象。相反,我們在大多數需要類文件對象的地方。

此外,大多數情況下,標準庫試圖避免指定鴨子類型的特定方法需求。這使得實施可以改變。例如,API可能已經根據可迭代項或按照序列來定義。

如果您想要比這更具體,可以使用abstract base classes。有幾個已經包含在collections module(如Iterable,Hashable和Sized)或numbers module(Rational,Integral等)中。在這些人寫下你之後,塑造並不難。然後,文件簡單地提及需要哪些ABC(即,xSizedIterableyIntegral)。

+0

與最後一段進行了比較:我的鴨子類型是新類型,所以要寫抽象基類。 – Thanatos

1

鴨子打字的重點在於「打字」的概念成爲一種抽象的直觀的想法,而不是正式的語言部分。與類型檢查是語言的一部分的語言相比,這使得打字更加流暢和靈活。

什麼用鴨打字時要求不說,程序知道什麼「型」你使用,但其他程序員做。所以,如果你擁有類/功能/ etc中的一個特定的「類型」的對象操作整個家庭,以及該類型不能用幾句話來描述的,只添加註釋部分或文檔字符串(甚至一個外部.txt文件)描述你的類型並命名它。那麼你可以在任何地方提及這個名字。

1

更嚴格的類型語言,如Java,有「接口」的概念:那實現接口的類應該提供方法的集合。

我想你可以借用這個概念,而不沿嚴格類型的行李必然帶來:只要定義和記錄一個抽象類Foo,然後說你的方法需要「一個FooFoo樣的對象」。如果你不想做任何其他的課程,你甚至不需要從Foo實際繼承;閱讀文檔的人們仍然會知道去哪裏去找出類似於對象的預期結果。