Python尝试多条语句处理相同错误

0 投票
5 回答
1117 浏览
提问于 2025-04-16 07:10

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

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

但是,如果att1不存在并且抛出了一个AttributeError错误,它就不会尝试检查其他两个属性。我必须用循环吗?难道没有办法在一个try语句中完成吗?

谢谢!

5 个回答

0

你是想用这个方法来检查某个对象是否有属性吗?如果是这样的话,可以直接使用内置的函数 hasattr(其实这个函数做的测试和你手动实现的功能是一样的)。


如果不是,那你就得用循环了。

想想代码的结构,其实你真正想要的是三个 try...except 块——毕竟,如果异常处理后能返回到它们被抛出的地方,那就不算是异常了!

不过,写一个循环其实很简单:

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

为什么不直接这样做呢:

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

这里不需要使用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}

撰写回答