4

我的問題更多面向Python,但也可能是關於JavaScript或其他腳本語言。如何在動態類型語言中描述函數參數?

我通常使用靜態類型語言(Java,C++,ActionScript,...)進行開發。

我喜歡不時使用Python,而且我還需要有時使用JavaScript。這些是動態類型語言。沒有什麼不對,但我通常有很多頭痛的問題來了解函數或方法中需要哪些參數。它發生,即使它是我自己的代碼與一些docstrings!也許是因爲眼睛不得不在功能的定義中尋找其他位置。

當然,答案應該在文檔中。但有時並不清楚所有,或因爲使用鴨的鍵入文檔本身可以是很難寫(「第一個參數是必須有一個庸醫()方法和羽毛(ARG)方法,其中一個功能arg是一個字符串「)。我非常喜歡的是在語言本身內部的一種參數描述(即使它是單獨的,就像ActionScript一樣)。

明確描述函數/方法參數的最佳實踐是什麼?

如何創建一個特殊的裝飾器(如果使用Python),其目的是檢查數據類型,當我們使用它(但因爲它將在運行時使用,而不是在寫入時間,無論如何將是點)?

你認爲這不應該是一個問題嗎?做比當前的文檔字符串更多會混淆開發人員,或者我的思想太靜態輸入導向?

+0

忘掉這樣的裝飾。這對文檔沒有用處,非常複雜(如果正確完成),引入大量開銷,即使那樣也會危及鴨子打字,並且不會給你帶來類型檢查的任何好處(檢查而不運行程序,上述文檔,優化等) )。你介意*是*「太過靜態輸入」。 – delnan 2012-04-29 13:21:07

+0

也許它確實是:)但是我有時會覺得花時間去理解一些Python庫的文檔,只是爲了知道我必須給出什麼論點;而我只需要用靜態類型來查看函數/方法簽名。我知道動態類型允許打破靜態類型語言的一些限制,但是,如果它意味着對圖書館的使用不清楚,我覺得我會失去一些時間。 – 2012-04-29 18:01:38

回答

2

我不知道有關JavaScript,但Python有可選function annotations自3版本,它看起來像:

def haul(item: Haulable, *vargs: PackAnimal) -> Distance: 

或:

def compile(source: "something compilable", 
      filename: "where the compilable thing comes from", 
      mode: "is this a single statement or a suite?"): 

看到the PEP以獲取更多信息。

它們可以在運行時訪問,甚至可以用於type checking

+0

我相信OP在詢問他應該使用的寫作風格,而你建議他可以寫作的地方......所以我不確定這是否真的回答了這個問題。 – 2012-04-29 13:08:35

+0

他問:「如何創建一個特殊的裝飾器(如果使用Python),目的是在我們使用它時檢查數據的類型(但是因爲它將在運行時使用,而不是在寫入時,反正會有什麼意義)?」 - 功能註釋解決了這個問題,因爲它可以同時用於兩種用例。 – ch3ka 2012-04-29 13:12:59

+0

啊,你是對的 - 請原諒我錯過了那部分。 – 2012-04-29 13:13:37

0

爲什麼鴨打字使得文檔很難寫?

當你編寫一個函數時,假設參數是一個特定類型的參數或者確認一個特定的接口來編寫函數......所以只需記錄它。

例如,如果你有一個swim_in_pond(duck)方法,沒有必要記錄「duck預計將有quack()swim()dive()方法」 - 在大多數情況下,這是完全足夠的說「duckDuck實例」。或者,如果你記錄了「Duck樣」的界面是非常重要的,我發現它有利於聲明基類作爲文檔:

class DuckBase(object): 
    def quack(self): 
     """ Makes the duck quack. """ 

    def swim(self): 
     """ Swims around. 
      Assumes the duck is already in water. 
      Updates the duck's position. """ 

    def dive(self): 
     """ Dives either as deep as possible (either until the duck runs out of 
      air, or it hits the bottom of the pond). """ 
+0

這實際上是鴨打字? – 2012-04-29 13:13:54

+0

@DanRoberts如果'swim_in_pond'接受任何帶有(丟失,非正式定義的)接口的對象,它就是。 – delnan 2012-04-29 13:22:34