2014-08-30 48 views
2

我正在使用python 3.3。考慮一下這個功能:爲什麼關鍵字參數不能在可變位置參數之前?

def foo(action, log=False,*args) : 
    print(action) 
    print(log) 
    print(args) 
    print() 

下面的調用按預期工作:

foo("A",True,"C","D","E") 

A 
True 
('C', 'D', 'E') 

但是這一次沒有。

foo("A",log=True,"C","D","E") 

SyntaxError: non-keyword arg after keyword arg 

爲什麼會出現這種情況?
難道這不知何故引入歧義?

回答

6

考慮以下幾點:

def foo(bar="baz", bat=False, *args): 
    ... 

現在,如果我叫

foo(bat=True, "bar") 

哪裏 「吧」 走?或者:

  • bar = "bar", bat = True, args =(),或
  • bar = "baz", bat = True, args = ("bar",),甚至
  • bar = "baz", bat = "bar", args =()

,併爲其中之一應該是沒有明顯的選擇(至少前兩個之間)。我們想bat = True'消費'第二個參數槽,但是不清楚剩下的參數應該被消耗在哪一個順序中:把它看作好像bat根本不存在並且把所有東西都移到左邊,或者把它當作bat將「光標」移動到下一個參數上。或者,如果我們想要做一些真正奇怪的事情,我們可以辯護說,參數元組中的第二個參數總是與第二個位置參數一致,無論是否傳遞了其他關鍵字參數。

無論如何,我們留下了一些令人困惑的事情,有人會驚訝我們選擇哪一個,而不管它是哪一個。 Python的目標是簡單和乾淨,並且希望避免做出任何可能不直觀的語言設計選擇。 There should be one-- and preferably only one --obvious way to do it

1

關鍵字參數的功能是雙重的:

  1. 爲了提供一個接口,它不依賴的參數的數量級上的功能。
  2. 提供一種方法來減少將參數傳遞給函數時的不確定性。

提供關鍵字的混合物,並下令參數只是一個問題,當你提供之前有序參數的關鍵字參數。爲什麼是這樣?

兩個原因:

  1. 這是令人困惑的閱讀。如果您提供有序的參數,爲什麼要標註其中的一些而不是其他標籤?
  2. 處理參數的算法是不必要和複雜的。你可以在你的'命令'參數後面提供關鍵字參數。這是有道理的,因爲很明顯,直到您使用關鍵字爲止,一切都是訂購。然而;如果您在有序參數之間使用關鍵字,則沒有明確的方法來確定您是否仍在排序您的參數。
相關問題