gpt4 book ai didi

python - **kwargs 和默认参数

转载 作者:行者123 更新时间:2023-11-28 19:46:46 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com