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

Reply via email to