Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Possible to change function name in definition?

I tried several ways to change the function name in the definition, but they failed.

>>> def f():
        pass
>>> f.__name__
'f'
>>> def f():
        f.__name__ = 'new name'
>>> f.__name__
'f'
>>> def f():
        self.__name__ = 'new name'
>>> f.__name__
'f'

But I can change the name attribute after defining it.

>>> def f():
        pass
>>> f.__name__ = 'new name'
>>> f.__name__
'new name'

Any way to change/set it in the definition (other than using a decorator)?

like image 840
beardc Avatar asked Jun 03 '12 22:06

beardc


3 Answers

The function body is not executed until you execute the function. You could use a decorator though:

def rename(newname):
    def decorator(f):
        f.__name__ = newname
        return f
    return decorator

And then use it like this:

@rename('new name')
def f():
    pass
print f.__name__

However, the function is still only reachable as f.

like image 55
ThiefMaster Avatar answered Oct 12 '22 03:10

ThiefMaster


No. The closest you can come to this is defining a callable class with each instance having its __name__ set in the initializer.

like image 34
Ignacio Vazquez-Abrams Avatar answered Oct 12 '22 03:10

Ignacio Vazquez-Abrams


The function body is not executed until you call the function, so there's no way you can use the function body to alter what happens at definition time. Why do you want to do this anyway? If you're writing the function and want it to have a different name, just define it with a different name.

like image 24
BrenBarn Avatar answered Oct 12 '22 03:10

BrenBarn