2011-01-06 119 views
3

我觉得必须有一些简单的东西,我在这里想念。 这是我想做的事:如何编写一个Python函数来接受*参数和关键字参数?

>>> def x(*args, a=False): 
... print args, a 

>>> x(1,2) 
(1,2) False 

>>> x(1,2,3, a=True) 
(1,2,3) True 

但你不能这样定义一个函数。

我知道这会工作,但它似乎并不漂亮:

>>> def x(*args, **kwargs): 
... if 'a' in kwargs: 
...  a = kwargs['a'] 
... else 
...  a = False 
... print args, a 

什么是做到这一点的最好方法是什么?
我正在使用python 2.6

+1

我知道你正在使用2.6,但如果这是一个简单的脚本,我不知道是否有可能将其移动到3.0。我刚刚在3.2中测试了你的确切代码,它完美地工作(可能是因为Py3的'头部'和'尾部'的概念,这非常棒) – jonesy 2011-01-06 04:22:31

回答

5

我觉得你有什么是唯一的出路。但是你可以把它写漂亮:

def x(*args, **kwargs): 
    a = kwargs.get('a', False) 
    print args, a 

x(1,2,3,a=42) 
+0

我可能夸大了这个选择有多难看:p – Jake 2011-01-06 04:13:19

+0

你可能想在'kwargs'中加入'assert'a'之类的东西,'a'是必须的''或'如果'a'不是kwargs:raise TypeError(“x采用一个关键字参数,没有给出”)来帮助调试问题。 – 2011-01-06 11:22:25

0

那么所有*参数真的是一个变量列表的参数和所有** kwargs真的是一个字典关键字只有参数。

除非我误解,为什么不这样做呢?

def x(args, a=False): 
    print args, a 

x((1,2),True) #<- just passes in a list instead of special list and dict 

output 
(1,2) True 

x((1,2)) 

output 
(1,2) False 

不无变量*参数列表和检测的** kwargs关键字参数仅作为字典Python的,但可能适用于您的需求。

+0

这是我想到的最好的解决方案,但希望有更好的东西。 – Jake 2011-01-06 04:11:10

0

所以用默认的参数至上你要么必须把你的第二个选择,或者你必须重新排序参数:

def x(a=False, *args): 
+1

考虑到,但我不得不调用'x(False,1,2,3)'而不是'x(1,2,3)',在这种情况下,它可能是'def x(a, * args):' – Jake 2011-01-06 04:12:30

3

刚刚发现这个http://www.python.org/dev/peps/pep-3102/

的第一个变化是,允许定期 参数的可变参数 争吵后出现:

def sortwords(*wordlist, case_sensitive=False): 
    ... 

此功能接受任意数量的 位置参数,并且它还接受一个名为0的关键字选项'case_sensitive'。

所以它的未来在Python 3

+2

FWIW,Python 3在这里,如果你可以使用它。 – aaronasterling 2011-01-06 04:22:18

相关问题