【问题标题】:What data model methods implement argument keyword unpacking?哪些数据模型方法实现了参数关键字解包?
【发布时间】:2018-09-15 09:58:10
【问题描述】:

我有一个类,我希望能够使用 *args 和 **kwargs 语法将其解压缩到参数列表中。

class MyFoo:
    x = 1
    y = 2 # unpack x and y
    z = 3 # do not unpack z

def bar(x, y):
    print(x, y)

def baz(a, b=2, x=100, y=100, z=5):
    print(a, b, x+2, y+2, z)

foo = MyFoo()

bar(*foo) # should print "1 2"
baz(1, **foo) # should print "1 2 3 4 5"

我可以通过定义__iter__来实现*foo:

def __iter__(self):
    return iter([self.x, self.y])

但是我一直无法弄清楚如何实现**foo。需要实现哪些方法来做到这一点?

【问题讨论】:

  • 我觉得你需要__dict__()
  • 附注你能修复你的代码示例的格式吗?

标签: python argument-unpacking python-datamodel


【解决方案1】:

我们只需要重写keys 来获取要解包的属性的名称,然后__getitem__(最好作为类方法)来访问它们的值。检查以下:

class MyFoo(object):
  x = 1
  y = 2 # unpack x and y
  z = 3 # do not unpack z

  def __iter__(self):
      return iter([self.x, self.y])

  def keys(self):
      return ['x', 'y']

  @classmethod
  def __getitem__(cls, key):
    return cls.__dict__[key]



def bar(x, y):
  print(x, y)

def baz(a, b=2, x=100, y=100, z=5):
  print(a, b, x+2, y+2, z)

foo = MyFoo()

bar(*foo) # should print "1 2"
baz(1, **foo) # should print "1 2 3 4 5"

【讨论】:

    猜你喜欢
    • 2021-10-11
    • 2020-02-20
    • 2014-09-07
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2019-03-17
    相关资源
    最近更新 更多