代码之家  ›  专栏  ›  技术社区  ›  Stefan Papp

如何使用getitem返回对象树中的对象?

  •  0
  • Stefan Papp  · 技术社区  · 6 年前

    我有一个从json加载的命名元组

    with open(self._json_path) as data_file:
        self._dom = json.load(data_file, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
    

    我通过引用访问此对象树的内容

    self._dom.my_var.A
    

    但是,如果没有设置JSON中的可选属性,则尝试访问它们时会遇到异常。

    所以

      self._dom.my_var.B 
    

    如果在JSON文件中未定义B,则无法工作。

    为此,我想提供一种保存方法,通过 __getitem__ . 如果没有定义,则不返回任何值。

    这段代码不起作用,因为self.dom.key查找一个名为“key”的属性,即使在对象树中定义了一个对象,也不会在属性错误中运行。

    def __getitem__(self, key):
        try:
            return self.dom.key
        except AttributeError:
            return None
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Stefan Papp    6 年前

    这段代码解决了这个问题。

    def __getitem__(self, key):
        obj = self.dom
        try:
            for k in key.split("."):
                obj = getattr(obj, k)
        except AttributeError:
            return None
        return obj
    

    编辑 还有一个简短的版本

    def __getitem__(self, key):
        f = attrgetter(key)
        return f(self.dom)