【问题标题】:Python: unpack init args into member variables cleanlyPython:将init args干净地解压缩到成员变量中
【发布时间】:2017-03-15 02:34:24
【问题描述】:

考虑下面的示例类:

class Foo(object):
    def __init__(self, a=2, b=0, c=1, d=42):
        self.a = a
        self.b = b
        self.c = c
        self.d = d

有没有一种干净的方法可以将 kwargs 解压到成员变量中?也许这个例子是微不足道的,但想象一个有 17 个长名称成员变量的构造函数,比如redundant_data_structure_that_we_should_probably_remove。我知道setattr(),例如在this other question,但我不想在构造函数中接受**kwargs——也就是说,我只想解压缩定义的成员变量abcd

【问题讨论】:

  • self.__dict__.update(locals()) 怎么样?这会设置任何不需要的属性吗?
  • @Rawing 是的。它设置了一个不需要的self.self
  • 查看attrs 包。

标签: python setattr


【解决方案1】:

我以前看过这个,并得出结论没有很好的方法来自动化样板。

幸运的是,你通常不需要它:

  • 如果您在__init__ 中传递了17 个成员变量,则该重构了。
  • 如果您的类只是一个命名空间/数据包,请不要首先使用类。

如果您想尝试使用库来删除重复项,请查看python-fields,或稍微不那么神奇的attrs

【讨论】:

  • 对内置数据结构有什么建议吗?
  • 如果没有关于您的要求或用例的更多信息,我真的无法提出建议。如有疑问,只需使用dict。如果你真的想要 getattr 风格的访问而不是 getitem 风格的访问,你可以使用 argparse 模块中免费提供的 Namespace 类。 namedtuple 工作正常,真的,只是不要看它是如何实现的,因为它很可怕。
  • 我喜欢这种解决XY Problem 的方式,并关注罪魁祸首:单个函数的参数太多。
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 2017-04-05
相关资源
最近更新 更多