Python函數的參數列表中嵌套格式『[ [, [, ]]]』該如何理解,和一般的位置參數表示的區別有哪些?
還有哪些命令的格式?
引申問題:時常看到Linux的終端命令也有很多格式,他們分別代表什麼?如圖:process([group[,target[,name[,args[,kwargs] ] ] ] ] )
還有下面的:Thread(group=None,target=None,name=None,args=(),kwargs={})
3/11/2014 更新感謝@Cosmia Fu 的指正,已經對於答案進行修改================================
@Cosmia Fu同學提到的可以跳過group直接設置target這個。乍看起來,確實可以成立,但是有一個前提,那就是group屬性自帶默認值。這點在函數對象上也通用,例如:
def foo(a=None,b=None):
print a,b
foo(b=123) # 輸出 None 123
但是切莫以為這個違背了位置參數的性質。事實上,函數的默認值早已包含在函數對象中,在調用之前,Python就會自動將這些參數填入,然後對用戶自定義了的參數進行"替換"。實際上是替我們完成了自動補全的功能,而不是「跳過」了某些參數。在此,group依然被定義。
不過對於此類帶有默認值的函數,[]表示法確實不規範。經過查找,題主的圖片應該是來源於Python Essential Reference這本書,而官方的Process文檔採用的和Thread類一樣的格式。
對於class的聲明,Python官方文檔的要求如下:Describes a class. The signature can include parentheses with parameters which will be shown as the constructor arguments
所以對於class來說,其實如圖中Thread類的表示方式才是最清楚直接的,截圖中Process的表示方式是不標準的。嵌套式的表示法在文檔中,多見於builtin裡面的函數,並且這類函數至少有一個參數是不指定默認值的,下面也將以此類的function為例。
================================
其實這個是個相當有趣的問題,我之前都沒怎麼想過。
根據Python官方文檔的要求:http://docs.python.org/devguide/documenting.htmlThe signature should include the parameters, enclosing optional parameters in brackets
也就是說這個[,]代表著參數是可選的。但是為什麼會會出現嵌套結構呢?
思考過之後,我覺得這個和Python的函數參數的種類有關係,這種嵌套的表示方式暗含了函數參數的位置順序和優先順序:Python有三種不同種類的參數:1.位置參數2.變長參數(*args)3.鍵參數(**kwargs)其中位置參數比較特殊,顧名思義這類參數完全靠順序來判定。以廣受愛戴的open函數為例:open(name[, mode[, buffering]])
f1 = open(file1.txt)
f2 = open(file2.txt,w)
f3 = open(file3.txt,rb,1024)
注意,在不使用「key=value」這種方式指定參數的情況下,你只能按照文檔給定的順序設置參數,而不可能打亂這個順序,比如說設置了name和buffering卻不去設置mode。原因就是因為,對於位置參數而言,傳入參數的位置是標誌這一參數的唯一依據。注意,mode和buffering是帶有默認值的,所以上例中的f1才能如此聲明。
所以這種嵌套括弧表示,無非是想申明一種順序關係罷了,提醒讀者參數位置不可被打亂。針對open這個函數,這種格式無非是想說說明:調用open函數,請依次傳入name,mode,buffering。推薦閱讀:
※VisPy 中文文檔:APP模塊
※模式匹配是如何提高可讀性的——一個面向小白的例子
※誤刪除pycharm項目中的文件,如何恢復?
※數據可視化工具matplotlib複習總結
※python是對面向對象編程友好的語言嗎?有沒有改進空間?