当** kwargs给出时,如何在python中使* args可选?

时间:2014-01-27 22:59:55

标签: python variadic-functions keyword-argument

我有这段代码:

class Test(object):
   def f1(self,*args,**kwargs):
       print args
       print kwargs
       self.f2(*args,**kwargs)

   def f2(self,*args,**kwargs):
       print "calling f2"
       print "args= ",args
       print "kwargs= ",kwargs

t = Test()
args = [1,2,3]
kwargs= {'a':1,'b':2}
t.f1(args,kwargs)
#second call
t.f1(kwargs)

并打印

([1, 2, 3], {'a': 1, 'b': 2})
{}
calling f2
args=  ([1, 2, 3], {'a': 1, 'b': 2})
kwargs=  {}
({'a': 1, 'b': 2},)
{}
calling f2
args=  ({'a': 1, 'b': 2},)
kwargs=  {}

我想在构造中选择*args。也就是说,如果我通过dict,则在上面的第二个调用中将其视为args。我不要那个。  我基本上想要这个结构: f1(*args,**kwargs)

- 如果存在*args,则处理*args  如果它不存在,则处理**kwargs,但不要将传递的字典作为*args  这是因为在任何情况下我都不会将dict传递给*args

2 个答案:

答案 0 :(得分:5)

t = Test()
args = [1,2,3]
kwargs= {'a':1,'b':2}
t.f1(args,kwargs)
t.f1(kwargs)

需要

t = Test()
args = [1,2,3]
kwargs= {'a':1,'b':2}
t.f1(*args,**kwargs)
t.f1(**kwargs)

否则它会传递argskwargs作为第一个和第二个参数(它们都会在函数内折叠为*args

您的参数解压缩正确,但没有为参数打包添加正确的语法。

答案 1 :(得分:2)

You're doing it wrong.

t.f1(*args, **kwargs)
t.f1(**kwargs)