代码之家  ›  专栏  ›  技术社区  ›  Davy8

在python中是否有一种更清晰的方法来链接空列表检查?

  •  3
  • Davy8  · 技术社区  · 15 年前

    我有一个相当复杂的对象(反序列化的JSON,所以我对它没有太多的控制权),我需要检查是否存在一个相当深的元素,并对其进行迭代,所以现在我有如下内容:

    if a.get("key") and a["key"][0] and a["key"][0][0] :
        for b in a["key"][0][0] :
            #Do something
    

    这是可行的,但很难看。似乎必须有更好的方法来做到这一点,那么什么是更优雅的解决方案呢?

    3 回复  |  直到 13 年前
        1
  •  14
  •   John Millikin    15 年前
    try:
      bs = a["key"][0][0]
    # Note: the syntax for catching exceptions is different in old versions
    # of Python. Use whichever one of these lines is appropriate to your version.
    except KeyError, IndexError, TypeError:   # Python 3
    except (KeyError, IndexError, TypeError): # Python 2
      bs = []
    for b in bs:
    

    如果你不介意长线,你可以把它打包成一个函数:

    def maybe_list(f):
      try:
        return f()
      except KeyError, IndexError, TypeError:
        return []
    
    for b in maybe_list(lambda: a["key"][0][0]):
    
        2
  •  3
  •   recursive    15 年前

    我将编写这样的自定义索引器函数:

    def safe_indexer(obj, *indices):
        for idx in indices:
            if not obj: break
    
            if hasattr(obj, "get"):
                obj = obj.get(idx)
            else:
                obj = obj[idx]
    
        return obj
    

    用途:

    a = {"key": {0: {0: "foo"} } };
    print safe_indexer(a, "key", 0, 0)
    print safe_indexer(a, "bad", 0, 0)
    

    输出:

    foo
    None
    
        3
  •  2
  •   Peter    15 年前

    这个怎么样:

    try:
        for b in a['key'][0][0]:
            # do stuff.
    except KeyError, TypeError, IndexError:
        # respond appropriately.