On 5/3/2009 3:39 PM bearophileh...@lycos.com said...
Sometimes I rename recursive functions, or I duplicate&modify them,
and they stop working because inside them there's one or more copy of
their old name.
This happens to me more than one time every year.
So I have written this:

from inspect import getframeinfo, currentframe

def SOMEVERYUGLYNAME(n):
    if n <= 1:
        return 1
    else:
        self_name = getframeinfo(currentframe()).function
        #self_name = getframeinfo(currentframe())[2] # older python

        # only if it's a global function
        #return n * globals()[self_name](n - 1)
        return n * eval(self_name + "(%d)" % (n - 1))
assert SOMEVERYUGLYNAME(6) == 2*3*4*5*6

Are there nicer ways to do that?

I've sometimes used classes like:


class SOMEVERYUGLYNAME:
    def __call__(self,n):
        if n<=1:
            return 1
        else:
            return n*self.__class__()(n-1)

assert SOMEVERYUGLYNAME()(6) == 2*3*4*5*6


It's probably nicer (for some definition of nice), but I wouldn't say it's nice.

Emile

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to