python - **kwargs 和默认参数

标签 python python-2.7 keyword-argument

class Klass:
  def __init__(self, **kwargs):
    self.func(variable=True, **kwargs)

  def func(self, variable=True, **kwargs):
    print(variable)


if __name__ == '__main__':
  Klass(variable=False)

我想知道为什么会出现 TypeError: func() got multiple values for keyword argument 'variable'

我认为它应该打印 False 因为我将 variable 的默认值覆盖为 False 并传递 kwargs 一路走来。

最佳答案

你不能传递相同的参数两次,variable=True, **kwargskwargs 时确实如此包含 variable 的 key ;在这种情况下,您有效地调用了电话 self.func(variable=True, variable=False)这显然是错误的。假设您无法收到 variable作为一个单独的参数,例如:

def __init__(self, variable=True, **kwargs):
    self.func(variable, **kwargs)

# On Python 3, you can easily keep variable keyword-only with:
def __init__(self, *, variable=True, **kwargs):
    self.func(variable, **kwargs)

# while the Python 2 equivalent for keyword-only args is rather nastier:
def __init__(self, *positional_forbidden, variable=True, **kwargs):
    if positional_forbidden:
        raise TypeError("__init__ takes 1 positional argument but {} were given".format(len(positional_forbidden)+1))
    self.func(variable, **kwargs)

那么另一种方法是在 kwargs 中设置默认值dict本身:

def __init__(self, **kwargs):
    kwargs.setdefault('variable', True)  # Sets variable to True only if not passed by caller
    self.func(**kwargs)

在 Python 3.5 中,使用 PEP 448's additional unpacking generalizations ,您可以将其安全地写成:

def __init__(self, **kwargs):
    self.func(**{'variable': True, **kwargs})

因为在创建新的 dict 时重复的键是合法的(只保留最后一次出现的键),因此您可以创建一个全新的 dict具有独特的映射,然后立即将其解压。

关于python - **kwargs 和默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51940581/

相关文章:

python - 使用 Python 通过 Internet 下载文件

Python 将日语输入转换为问号

python - 如何将 JSON 数据读取到 Python 中

python - django 中的 kwargs - 如何将 unique() 放入 kwargs

python - 解压字典以作为关键字参数传递时,如何将键映射到不同名称的关键字参数?

python - neo4j中索引和内部ID有什么区别?

python - 在Python中清除一个组

python - 使用带有 Python BeautifulSoup 的 LazyLoader 抓取页面

Python Sort 方法无法正确排序分数

python - 简化 `if ' foo' in kwargs and kwargs ['foo' ] is True :`