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

python尝试多个语句,但可能出现相同的错误

  •  0
  • rxmnnxfpvg  · 技术社区  · 14 年前

    我试图根据对象是否具有属性来设置一些布尔值:

    try:
        att1 = myobj.att1
        att2 = myobj.att2
        att3 = myobj.att3
    except AttributeError:
        pass
    

    但是,如果 att1 不存在并抛出 AttributeError ,它不会尝试其他两个。我必须循环吗(不能一次完成吗 try 声明?)

    谢谢!

    5 回复  |  直到 14 年前
        1
  •  1
  •   marr75    14 年前

    这里不需要try语句。例如:

    myobj = 10
    names = ['att1', 'att2', 'att3', 'real']
    results = dict((name, getattr(myobj, name, None)) for name in names)
    #{'real': 10, 'att3': None, 'att2': None, 'att1': None}
    
        2
  •  3
  •   mouad    14 年前

    为什么不直接做:

    your_boolean = hasattr(obj, att1) or hasattr(obj, att2) or hasattr(obj, att3)
    
        3
  •  0
  •   Katriel    14 年前

    你在用这个吗 只有 检查某个对象是否具有属性?如果是,请使用内置函数 hasattr (实际上它执行的测试与您手动实现的测试相同。


    否则,必须循环。

    如果你考虑一下代码的结构,你真正想要的是三次try…除了块——毕竟,如果异常在处理后返回到它们被引发的地方,它们就不会非常异常!

    写一个循环很容易,不过:

    atts = []
    for attr in ("att1", "att2", "att3"):
        try:
            attrs.append(getattr(myobj, attr))
        except AttributeError:
            attrs.append[None]
    att1, att2, att3 = atts
    

    如果您真的希望将属性作为局部变量,甚至可以执行以下操作:

    for attr in ("att1", "att2", "att3"):
        try:
            locals()[attr] = getattr(myobj, attr)
        except AttributeError:
            pass
    
        4
  •  0
  •   Tony Veijalainen    14 年前

    考虑到存在2×2×2可能的存在组合,为什么没有集合呢?

    set(attr for attr in ('att%i' for i in range(1,4)) if obj.hasattr(attr))
    
        5
  •  0
  •   user2066480    12 年前

    我想这也管用:

    try:
        (var1 and var2)
    except NameError:
        ...
    

    它将在做出决定前测试所有变量。