Skip to main content
 首页 » 编程设计

python之给出 **kwargs 时如何在 python 中使 *args 可选

2025年05月04日14qlqwjy

我有这个代码:

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。

请您参考如下方法:

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) 

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

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