Is there a generic way for a function to reference itself? Is there a generic way for a function to reference itself? python python

Is there a generic way for a function to reference itself?


There is no generic way for a function to refer to itself. Consider using a decorator instead. If all you want as you indicated was to print information about the function that can be done easily with a decorator:

from functools import wrapsdef showinfo(f):    @wraps(f)    def wrapper(*args, **kwds):         print(f.__name__, f.__hash__)         return f(*args, **kwds)    return wrapper@showinfodef aa():    pass

If you really do need to reference the function, then just add it to the function arguments:

def withself(f):    @wraps(f)    def wrapper(*args, **kwds):        return f(f, *args, **kwds)    return wrapper@withselfdef aa(self):      print(self.__name__)      # etc.

Edit to add alternate decorator:

You can also write a simpler (and probably faster) decorator that will make the wrapped function work correctly with Python's introspection:

def bind(f):    """Decorate function `f` to pass a reference to the function    as the first argument"""    return f.__get__(f, type(f))@binddef foo(self, x):    "This is a bound function!"    print(self, x)>>> foo(42)<function foo at 0x02A46030> 42>>> help(foo)Help on method foo in module __main__:foo(self, x) method of builtins.function instance    This is a bound function!

This leverages Python's descriptor protocol: functions have a __get__ method that is used to create bound methods. The decorator simply uses the existing method to make the function a bound method of itself. It will only work for standalone functions, if you wanted a method to be able to reference itself you would have to do something more like the original solution.


http://docs.python.org/library/inspect.html looks promising:

import inspectdef foo():     felf = globals()[inspect.getframeinfo(inspect.currentframe()).function]     print felf.__name__, felf.__doc__

you can also use the sys module to get the name of the current function:

import sysdef bar():     felf = globals()[sys._getframe().f_code.co_name]     print felf.__name__, felf.__doc__


You can at least say self = bb in the first line, and then you only need to change that line when you change the function name, instead of every other reference.

My code editor highlights the variable self the same way it does for classes, too.