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

bra*_*orm 1 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)
Run Code Online (Sandbox Code Playgroud)

它打印出来

([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=  {}
Run Code Online (Sandbox Code Playgroud)

我想*args在构造中选择.那就是如果我通过dict,就像args上面第二次调用一样.我不要那个.我基本上想要这个结构: f1(*args,**kwargs)

-如果*args存在,则处理*args ,如果它不存在,那么过程**kwargs,但不要采取传递是字典*args 那是因为我不会被传递dict*args在任何情况下.

mhl*_*ter 5

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

需要是

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

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

你有参数解包正确,但没有为参数打包添加正确的语法.