【问题标题】:Passing a dictionary into __init__ in Python, and having issues [duplicate]在 Python 中将字典传递给 __init__ 并遇到问题 [重复]
【发布时间】:2021-02-26 02:10:10
【问题描述】:
class CashRegister:
    def __init__(self, user, **kwargs):
        self.user = user
        self.items = kwargs

myRegister = CashRegister('name')

print(type(myRegister.items))

上面的代码告诉我 self.items 参数(输出:)是一个字典。所以它存在。但是,当我这样做时。

myRegister = CashRegister('name', {'a': 1, 'b': 2})

我收到以下错误。

myRegister = CashRegister('name', {'a': 1, 'b': 2}) TypeError: __init__() takes 2 positional arguments but 3 were given

我做错了什么?

【问题讨论】:

  • **kwargs 在函数定义签名中使您的函数采用任意数量的关键字参数。这些将被分组到您的功能中的dictkwargs。当你像这样调用你的函数时:CashRegister('name', {'a': 1, 'b': 2}) 你没有提供 *any 关键字参数,你提供了 2 个位置参数,但你只定义了你的函数来接受一个,name。因此错误

标签: python class dictionary


【解决方案1】:

你需要在两端“双打”。像这样调用你的函数:

R2 = CashRegister('name', **{'fish':19.99, 'frisbee':14.98})
print(R2.items)

输出:

{'fish': 19.99, 'frisbee': 14.98}

【讨论】:

  • 你太棒了!!非常感谢!!
【解决方案2】:

如果您想将 dict 传递给函数,则不需要 ** — 它将它们分散到单独的关键字参数中。只需将其设为接受字典的单个参数即可:

class CashRegister:
    def __init__(self, user, items):
        self.user = user
        self.items = items

c = CashRegister('name', {'a': 1, 'b': 2})
print(c.items)
# {'a': 1, 'b': 2}

【讨论】:

  • 马克,我是初学者。不知道我能做到这一点。非常感谢!
  • @jpsamudrala 整个 *args **kwargs 约定起初对我来说有点困难。花一点时间习惯它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 2023-04-03
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
相关资源
最近更新 更多