python尝试多个语句同样可能的错误

时间:2010-11-16 22:23:43

标签: python

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

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

但是,如果att1不存在并抛出AttributeError,则不会尝试其他两个。我必须循环(有没有办法在一个try语句中执行此操作?)

谢谢!

5 个答案:

答案 0 :(得分:3)

为什么不这样做:

your_boolean = hasattr(obj, att1) or hasattr(obj, att2) or hasattr(obj, att3)

答案 1 :(得分:1)

这里不需要试试声明。例如:

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 :(得分:0)

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


否则,你必须循环。

如果你考虑代码的结构,你真正想要的是三个尝试...除了块 - 毕竟,如果异常返回流到处理后它们被引发的地方,它们就不会很例外!

但是编写一个循环很容易:

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

答案 3 :(得分:0)

考虑到存在2 * 2 * 2种可能存在的组合,为什么不设置?

set(attr for attr in ('att%i' for i in range(1,4)) if obj.hasattr(attr))

答案 4 :(得分:0)

我认为这也有效:

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

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