gpt4 book ai didi

Python 函数 "remembering"前面的参数 (**kwargs)

转载 作者:太空狗 更新时间:2023-10-30 01:43:55 25 4
gpt4 key购买 nike

我有一些具有属性字典的对象,obj.attrs。为方便起见,这些对象的构造函数接受字典和/或 **kwargs

看起来有点像这样:

class Thing:
def __init__(self, attrs={}, **kwargs):
for arg in kwargs:
attrs[arg] = kwargs[arg]
self.attrs = attrs

Thing({'color':'red'})Thing(color='red') 的作用相同。

我的问题是构造函数以某种方式记住传递给它的最后一个 attrs 值。

例如:

>>> thing1 = Thing(color='red')
>>> thing2 = Thing()
>>> thing2.attrs
{'color': 'red'}

...但是 thing2.attrs 应该只是一个空字典! {}

这让我想知道使用 both **kwargs andattrs= 这样的参数是否不是问题{}

有什么想法吗?

最佳答案

使用默认参数的问题是它们实际上只存在一个实例。当您在 init 方法定义中使用 attrs={} 时,单个默认 {} 实例是每次调用该方法的默认实例(它不会创建新的每次默认为空字典,它使用相同的字典)。

问题是,如果只有一个 attrs 存在,那么对于 Thing you say self.attrs = attrs 的每个实例,self.attrs 每个实例的成员变量都指向 attrs 的单个共享默认实例。

另一个问题是,这不是完全多余的吗?您可以使用 **kwargs 来传递关键字/值参数或字典。如果你刚刚定义了这个:

class Thing:
def __init__(self, **kwargs):
for arg in kwargs:
self.attrs[arg] = kwargs[arg]

所有这些策略仍然有效:

thing1 = Thing(color='red')

thing2 = Thing(**{'color':'red'})

my_dict = {'color' : 'red'}
thing3 = Thing(**my_dict)

因此,如果您简单地以这种方式定义和使用 Thing,您将完全避免您的问题。

关于Python 函数 "remembering"前面的参数 (**kwargs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6794285/

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