2010-11-16 55 views
0

我正在尝试设置基于对象是否具有属性的一些布尔:蟒蛇尝试用相同的可能错误多个语句

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

但是,如果att1不存在,抛出AttributeError,它赢得别试试其他两个。我必须循环吗(有没有办法做到这一点try声明?)

谢谢!

回答

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} 
+0

确实如此。我喜欢这个getattr函数。 – ash 2010-11-17 21:32:45

+0

很少有语言使得元编程像Python一样简单而干净。 – marr75 2010-11-18 19:33:59

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 
+0

太棒了。我不是仅仅为了存在而测试,所以我想我必须循环。感谢您的解释。 – ash 2010-11-16 22:37:42

3

为什么不只是做:

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

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

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

我认为这也适用:

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

它会在作出决定前测试所有的变量。