如何编写python函数来接受*参数和关键字参数?

时间:2011-01-06 03:55:57

标签: 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

4 个答案:

答案 0 :(得分:5)

我认为你拥有的是唯一的方式。但你可以写得更好:

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

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

答案 1 :(得分:3)

刚刚找到这个http://www.python.org/dev/peps/pep-3102/

  

第一个变化是允许常规   在varargs之后出现的参数   参数:

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

此功能接受任意数量的   位置论证,它也   接受名为的关键字选项   'CASE_SENSITIVE'。

所以它将在Python 3中出现

答案 2 :(得分:0)

所有* args确实是一个变量参数列表,所有** 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关键字参数dict,它可能不是pythonic但可能适合您的需要。

答案 3 :(得分:0)

您必须采取第二种选择,或者您必须重新排序参数,以便首先使用默认参数:

def x(a=False, *args):