我正在尝试设置基于对象是否具有属性的一些布尔:蟒蛇尝试用相同的可能错误多个语句
try:
att1 = myobj.att1
att2 = myobj.att2
att3 = myobj.att3
except AttributeError:
pass
但是,如果att1
不存在,抛出AttributeError
,它赢得别试试其他两个。我必须循环吗(有没有办法做到这一点try
声明?)
谢谢!
我正在尝试设置基于对象是否具有属性的一些布尔:蟒蛇尝试用相同的可能错误多个语句
try:
att1 = myobj.att1
att2 = myobj.att2
att3 = myobj.att3
except AttributeError:
pass
但是,如果att1
不存在,抛出AttributeError
,它赢得别试试其他两个。我必须循环吗(有没有办法做到这一点try
声明?)
谢谢!
无需这里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}
您是否仅使用此来检查某个对象是否具有属性?如果是这样,使用内置函数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
太棒了。我不是仅仅为了存在而测试,所以我想我必须循环。感谢您的解释。 – ash 2010-11-16 22:37:42
为什么不只是做:
your_boolean = hasattr(obj, att1) or hasattr(obj, att2) or hasattr(obj, att3)
考虑到存在2 * 2 * 2个可能的存在组合,为什么不设置?
set(attr for attr in ('att%i' for i in range(1,4)) if obj.hasattr(attr))
我认为这也适用:
try:
(var1 and var2)
except NameError:
...
它会在作出决定前测试所有的变量。
确实如此。我喜欢这个getattr函数。 – ash 2010-11-17 21:32:45
很少有语言使得元编程像Python一样简单而干净。 – marr75 2010-11-18 19:33:59