2013-06-05 221 views
62

爲什麼這段代碼會拋出一個SyntaxError?爲什麼非默認參數不能遵循默認參數?

>>> def fun1(a="who is you", b="True", x, y): 
...  print a,b,x,y 
... 
    File "<stdin>", line 1 
SyntaxError: non-default argument follows default argument 

雖然下面這段代碼並沒有可見的錯誤運行:

>>> def fun1(x, y, a="who is you", b="True"): 
...  print a,b,x,y 
... 
+0

在Python是結構如何,當你定義一個函數 '高清myfunction的(position_arguments,*論點,**關鍵字):'' ....' – abhishekgarg

回答

72

所有必需的參數必須放在任何默認參數之前。只是因爲它們是強制性的,而默認參數不是。在語法上,如果允許混合模式,解釋器將決定哪些值匹配哪些參數將是不可能。如果參數未按正確順序給出,則會引發SyntaxError

讓我們看看關鍵字參數,使用您的函數。

def fun1(a="who is you", b="True", x, y): 
...  print a,b,x,y 

假設其允許聲明功能上面, 然後用上面的聲明,我們可以做出以下(常規)位置或關鍵字參數調用:

func1("ok a", "ok b", 1) # Is 1 assigned to x or ? 
func1(1)     # Is 1 assigned to a or ? 
func1(1, 2)    # ? 

,你會如何建議的分配函數調用中的變量,將如何使用默認參數以及關鍵字參數。

>>> def fun1(x, y, a="who is you", b="True"): 
...  print a,b,x,y 
... 

參考奧賴利 - 核心的Python
凡爲這個功能使用的默認參數爲上述函數調用語法正確。 關鍵字參數調用被證明對於能夠提供亂序位置參數非常有用,但是,與默認參數一起,它們也可以用於「跳過」缺少的參數。

+0

從句法上講,如果允許混合模式,解釋器不可能決定哪些值匹配哪些參數。 Ruby允許遵循默認參數的非默認參數。 如何在函數調用中建議賦值變量只需使用'func1(x = 1,y = 2)'。 – weakish

+0

嗨@weakish,感謝您的評論,Python確實有一個很好的方式來實現這一點,請去搜索*參數和** kwargs –

+0

嗨@Rahul Gautam我很困惑。我認爲'** kwargs'不能讓'fun fun1(a =「你是誰」,b =「True」,x,y)'或類似的作品。如果你使用'def f(** kwargs)',你需要處理正文中的默認值? – weakish

0

必需的參數(那些沒有默認值),必須在一開始就允許客戶端代碼僅提供兩個。如果可選參數是在開始,這將是混淆:

fun1("who is who", 3, "jack") 

你會在第一個例子中做什麼?最後,x是「誰是誰」,y是3,a =「傑克」。

9
SyntaxError: non-default argument follows default argument 

如果你要實現這一點,默認參數將變得毫無用處,因爲你將永遠無法使用它們的默認值,因爲非默認參數後前來

在Python 3然而,你可以做到以下幾點:

def fun1(a="who is you", b="True", *, x, y): 
    pass 

這使得僅xy關鍵字,所以你可以這樣做:

fun1(x=2, y=2) 

這工作,因爲不再有任何歧義。請注意,您仍然無法執行fun1(2, 2)(這將設置默認參數)。

+0

關鍵字只有參數是一個Python的實用的功能3.這個補丁太糟糕了,無法將它們恢復到Python 2.6和2.7版本,只是[left to expire](http://bugs.python.org/issue1745)。 –

3

讓我明確兩點的位置:

  • 首先非默認參數不應該遵循默認參數,這意味着你不能定義(A = B,C)中的功能定義參數的順序功能是:
    • 位置參數或非默認參數即(A,b,C)
    • 關鍵字參數或默認參數即(α= 「b」 中,r = 「J」)
    • 關鍵字定位只有參數即(*參數)
    • VAR-關鍵字參數即(** kwargs)

def example(a, b, c=None, r="w" , d=[], *ae, **ab):

(A,B)是位置參數

(C =無)是可選參數

(r =「w」)是關鍵字參數

(d = [])是列表參數

(* AE)是關鍵字只有

(** AB)是VAR關鍵字參數

  • 現在次要的東西是,如果我嘗試這樣: def example(a, b, c=a,d=b):
當保存默認值時,

參數未定義,Python計算 並在定義函數時保存默認值

c和d沒有定義,不存在,當發生這種情況時(它只存在於函數執行時)

「a,a = b」它在參數中是不允許的。

0

它是由python參數解析器的工作機制決定的。這裏沒什麼魔法。