69

我以爲我可以在Python 2中的函數調用中使用可變長度位置參數後的命名參數,但導入python類時我得到了SyntaxError。我用下面的「get」方法寫,例如:Python,可變長度位置參數後的默認關鍵字參數

class Foo(object): 
    def __init__(self): 
     print "You have created a Foo." 

    def get(self, *args, raw=False, vars=None): 
     print len(args) 
     print raw 
     print vars 

錯誤的樣子:

def get(self, *args, raw=False, vars=None): 
        ^
SyntaxError: invalid syntax 

我希望能夠調用的方法幾個方面:

f = Foo() 
f.get(arg1, arg2) 
f.get(arg1, raw=True) 
f.get(arg1, arg2, raw=True, vars=something) 

回答

61

它的工作,但只在Python 3 PEP見3102。從瀏覽「新增內容」文件看來,似乎沒有2.x後端軟件,所以你運氣不好。您必須接受任何關鍵字參數(**kwargs)並手動解析它。如果不存在,您可以使用d.get(k, default)獲得d[k]default。要從kwargs中刪除參數,例如在調用超類的方法之前,請使用d.pop


注意,在def get(self, *args, raw=False, vars=None):,在raw=Falsevars=None都無關關鍵字參數。這些是默認參數值。具有默認值的參數,可以在位置上度過的,沒有默認值的參數可以通過關鍵字進行傳遞:

def f(a=1): pass 
f(2) # works, passing a positionally 
def f(a): pass 
f(a=2) # works, passing a by keyword 

同樣,不需要只有關鍵字的參數有一個默認值。在*args爭吵後過來就是他們標記爲關鍵字只,而不是默認值的存在:

def f(*args, a): pass 
# a is a mandatory, keyword-only argument 
+0

謝謝你和Imran!你的回答與伊姆蘭的代碼塊和docstring建議完美地回答了這個問題。 – jkmacc 2011-05-09 18:56:28

41

Python的語法不允許在功能和使用默認值的關鍵字參數變量ARGS在同一時間。如果您必須具有關鍵字參數以及任意數量的位置參數,則還需要允許任意數量的關鍵字參數。

這是一個常見的模式,以提供關鍵字參數的默認值,以及允許任何數量的位置參數:

def foo(*args, **kwargs): 
    raw = kwargs.pop('raw', False) 
    vars = kwargs.pop('vars', None) 

如果您完全不使用額外的關鍵字參數,你有什麼擔心。這使得該函數的自我記錄少一點,您可以使用正確書寫的文檔字符串來彌補。