如何使** kwargs可选

时间:2015-06-23 16:30:39

标签: python optional-parameters kwargs

我有两个类具有相同名称的方法,但此方法使用不同的参数。所以我考虑使用**kwargs(参见下面的示例)。但是这两种方法中的一种不需要任何参数,所以我得到了这个错误:

  

TypeError:print_smt()接受1个位置参数但是2个被赋予

因为它将空字典传递给函数,我想。

我该如何解决这个问题?我是否被迫使用if语句来调用带有和不带参数的函数,或者有更好的方法来解决这个问题?

class Bar(object):
  def print_smt(self, text):
    print(text)

class Foo(object):
  def print_smt(self):
    print("Nothing")

def test(obj, **p2):
  obj.print_smt(p2)


bar = Bar()
test(bar, text='print this')

foo = Foo()
test(foo) # This one breaks!

2 个答案:

答案 0 :(得分:6)

致电时:

def test(obj, **p2):
  obj.print_smt(p2)

...您已将字典传递给print_smt()。即使它是一本空字典,它仍然是一本字典,你不能将字典作为参数传递给不带参数的东西。

如果要将关键字参数作为关键字参数传递,而不是作为带字典的单个位置参数,请执行以下操作:

def test(obj, **p2):
  obj.print_smt(**p2)

答案 1 :(得分:2)

在将kwargs 传递给print_smt函数之前,你必须解压缩kwargs 。这有效:

def test(obj, **p2):
  obj.print_smt(**p2)