我正在尝试根据对象是否具有属性来设置一些布尔值:
try:
att1 = myobj.att1
att2 = myobj.att2
att3 = myobj.att3
except AttributeError:
pass
但是,如果att1
不存在并抛出AttributeError
,则不会尝试其他两个。我必须循环(有没有办法在一个try
语句中执行此操作?)
谢谢!
答案 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:
...
它将在做出决定之前测试所有变量。