【问题标题】:Accessing dict "values" like an attribute?像属性一样访问字典“值”?
【发布时间】:2020-06-26 06:49:40
【问题描述】:

我正在寻找的是这样的东西:

self.info['key'].attr2

但我不确定实现它的最优雅的方式是什么。到目前为止,我已经定义了一个如下所示的字典,但没有其中的属性。

self.info  = {}
self.info.update({'key':
                        {'attr1':   2,
                         'attr2':   lambda: self.func(arg1)}
                       })

但是我必须像这样使用它:

self.info['key']['attr2']()

请注意,我正在寻找的是访问属性等字典值。 This thread 有一个可以在我的情况下使用的答案,也可能是我从上面的子字典中创建一个对象并将其作为主字典的值。

但我想知道是否有更好的方法,也许使用装饰器和更少的代码行,甚至可能不使用字典来完成我在第一行中描述的事情,也许更好:

self['key'].attr2

【问题讨论】:

  • collections.namedtuple,正如您链接的主题中所建议的那样?
  • 或类似的东西 --> github.com/Infinidat/munch
  • 这能回答你的问题吗? Accessing dict keys like an attribute?
  • 你为什么要这样做?
  • 还有一个 AttrDict 对象。请参阅github.com/bcj/AttrDict 不确定作者对只读状态的含义,可能是时候寻找替代包了。一个优点是您仍然可以使用字典方法,即o.attr2o.get("attr2")。大多数情况下,SimpleNamespace 的答案是我的选择。

标签: python dictionary properties attributes


【解决方案1】:

这是一个简短的包装器,用于将 dict 键作为属性访问:

class nameddict(dict):
   __getattr__ = dict.__getitem__

info = nameddict()
info['key'] = nameddict(attr1=2, attr2=3)

然后info['key'].attr2 以及info['key']['attr2']info.key.attr2 返回3

【讨论】:

    【解决方案2】:

    您可以使用collections.namedtuple,正如您链接的主题中所建议的那样:

    Attrs = namedtuple("Attrs", ["attr1", "attr2"])
    info = {"key": Attrs(attr1=2, attr2=lambda: 4)}
    info["key"].attr2()
    

    【讨论】:

      【解决方案3】:

      如果你想要一个更动态的容器,你不需要像在 namedtuple 中那样声明属性,你可以使用 SimpleNamespace 对象。

      from types import SimpleNamespace as ns
      info  = {}
      info.update({'key': ns(attr1=2, attr2=lambda x: x+1)})
      

      【讨论】:

      • 这只是 Python 3。
      • @Lior 如果名称“attr1”和“attr2”在一开始就作为字符串提供给我怎么办。
      【解决方案4】:

      有一个名为 Box 的库。很方便。 https://pypi.org/project/python-box/

      它处理各种边缘情况,例如字典和列表中的字典等。

      pip install python-box

      from box import Box
      
      movie_box = Box({
          "Robin Hood: Men in Tights": {
              "imdb_stars": 6.7,
              "length": 104,
              "stars": [ {"name": "Cary Elwes", "imdb": "nm0000144", "role": "Robin Hood"},
                         {"name": "Richard Lewis", "imdb": "nm0507659", "role": "Prince John"} ]
          }
      })
      
      movie_box.Robin_Hood_Men_in_Tights.imdb_stars
      # 6.7
      
      movie_box.Robin_Hood_Men_in_Tights.stars[0].name
      # 'Cary Elwes'
      
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-13
        • 2016-12-22
        • 2011-03-03
        相关资源
        最近更新 更多