簡體   English   中英

為什么關鍵字args不能在變量位置args之前?

[英]Why can't keyword args precede variable position args?

我正在使用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

為什么會這樣?
這會以某種方式引入歧義嗎?

考慮以下:

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旨在簡單而干凈,並且希望避免任何可能不直觀的語言設計選擇。 應該有一個 - 最好只有一個 - 顯而易見的方法

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

  1. 為不依賴於參數順序的函數提供接口。
  2. 提供一種在將參數傳遞給函數時減少歧義的方法。

在有序參數之前提供關鍵字參數時,提供關鍵字和有序參數的混合只是一個問題。 為什么是這樣?

兩個原因:

  1. 閱讀令人困惑。 如果您提供有序參數,為什么要標記其中一些而不是其他參數?
  2. 用於處理參數的算法將是不必要且復雜的。 您可以在“有序”參數后提供關鍵字args。 這是有道理的,因為很明顯,在您使用關鍵字之前,所有內容都已訂購 然而; 如果您在有序參數之間使用關鍵字,則沒有明確的方法來確定您是否仍在訂購參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM