On Apr 27, 11:01 am, John Henry <[EMAIL PROTECTED]> wrote:
> On Apr 26, 6:08 pm, "Martin v. Löwis" <[EMAIL PROTECTED]> wrote:
>
>
>
> > > def f1():
> > >    print "In f1"
>
> > > def f3():
> > >    print "In f3"
>
> > > def others():
> > >    print "In others"
>
> > > for i in xrange(1,3):
> > >    fct = "f%d()"%(i+1)
> > >    try:
> > >       exec fct
> > >    except:
> > >       others()
>
> > I'd write that as
>
> > for i in xrange(1,3):
> >     globals().get("f%d" % (i+1), others)()
>
> > Regards,
> > Martin
>
> Perfect.  Works great.  No EXEC.
>
> You guys are great.

If you just want to avoid exec, why not:

def f1:
    print "In f1"
def f3:
    print "In f3"

class f4(object):
    def __init__(self):
        print "In f4"

def others:
    print "Since all else failed, I'm in others."

f2 = "NAF -> Not a Function"

flist = [f1, f2, f3, f4]
for fct in flist:
    try:
        fct()
    except TypeError:
        others()

It's readable, and it's fast if there's just a few "hard fault" (try-
except works best when it usually succeed and just fails once or
twice), and it's Pythonic too (Easier to ask forgiveness than to ask
permission). The difference between this and the explicit type
checking is that this allows a class (like f4) to pass since a Class
Constructor & Initiator is a callable function too, depending on your
need, you might want to consider class constructor as a function too.
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to