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 don't know. If there aren't, then a way may be added. An idea-syntax: def fact(n): return 1 if n <= 1 else n * inspect.self(n - 1) Or even a lambda, because you don't need the name anymore to call the function: fact = lambda n: 1 if n <= 1 else n * self(n - 1) (If you have two or more recursive functions that call each other this idea can't be used, but I think such situations are uncommon enough to not deserve help from the language). Bye, bearophile -- http://mail.python.org/mailman/listinfo/python-list