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, **kwargs
当 kwargs
时确实如此包含 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/