2014-08-30 45 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. 处理参数的算法是不必要和复杂的。你可以在你的'命令'参数后面提供关键字参数。这是有道理的,因为很明显,直到您使用关键字为止,一切都是订购。然而;如果您在有序参数之间使用关键字,则没有明确的方法来确定您是否仍在排序您的参数。
相关问题