Peter Otten wrote:
Jean-Michel Pichavant wrote:
Chris Kaynor wrote:
On Wed, May 2, 2012 at 12:51 PM, J. Mwebaze <jmweb...@gmail.com> wrote:
I have multiple objects, where any of them can serve my purpose..
However some objects might not have some dependencies. I can not tell
before hand if the all the dependencies exsit. What i want to is begin
processing from the 1st object, if no exception is raised, i am done..
if an exception is
raised, the next object is tried, etc Something like
objs = [... ]
try:
obj = objs[0]
obj.make()
except Exception, e:
try:
obj = objs[1]
obj.make()
except Exception, e:
try:
obj = objs[2]
obj.make()
except Exception, e:
continue
The problem is the length of the list of objs is variable... How can i
do this?
for obj in objs:
try:
obj.make()
except Exception:
continue
else:
break
else:
raise RuntimeError('No object worked')
For the record, an alternative solution without try block:
Hmm, it's not sufficient that the method exists, it should succeed, too.
class Obj:
def make(self):
raise Exception("I'm afraid I can't do that")
objs = [Obj()]
candidates = [obj for obj in objs if hasattr(obj, 'make') and
callable(obj.make)]
if candidates:
candidates[0].make()
It is often a matter of taste, but I tend to prefer EAFP over LBYL.
Could be that the OP did its job by calling the make method if it
exists. If the method raises an exception, letting it through is a
viable option if you cannot handle the exception.
Additionaly, having a method not raising any exception is not a criteria
for success, for instance
def make(self):
return 42
will surely fail to do what the OP is expecting.
By the way on a unrelated topic, using try blocks to make the code
"robust" is never a good idea, I hope the OP is not try to do that.
JM
--
http://mail.python.org/mailman/listinfo/python-list