如何使 **kwargs 可选

How to make **kwargs optional

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

TypeError: print_smt() takes 1 positional argument but 2 were given

我想是因为它向函数传递了一个空字典。

我该如何解决这个问题?我是否被迫使用 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!

当你打电话时:

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

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


如果你想通过关键字参数作为关键字参数,而不是作为带有字典的单个位置参数,那么这样做:

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

您必须先解压 kwargs,然后再将其传递给 print_smt 函数。这有效:

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