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.html

The 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是對面向對象編程友好的語言嗎?有沒有改進空間?

TAG:Python | Linux | 終端命令 |