Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can one function have multiple names?

I'm developing a bot on Python (2.7, 3.4). I defined a about 30+ dynamic functions which to be used based on bot commands. While development, since not all functions are done, I have to define for them an empty functions (if I not define then code won't run) like this:

def c_about():
    return
def c_events():
    return
def c_currentlocation():
    return

etc. many dummy functions.

Question:
it is somehow possible in Python to define same function but with multiple names?
Something like this:

def c_about(), c_events(), c_currentlocation():
    return
like image 318
Sergey Zubkov Avatar asked Dec 06 '22 17:12

Sergey Zubkov


2 Answers

Yes, it's perfectly possible since defined functions are stored in variables like everything else.

def foo():
    pass

baz = bar = foo

There is still some metadata relating to the original function (help(bar) will still mention foo), but it doesn't affect functionality.

Another option is to use lambdas for one-liners:

foo = bar = baz = lambda: None
like image 103
Anonymous Avatar answered Dec 16 '22 15:12

Anonymous


Functions do not intern in Python (i.e., automatically share multiple references to the same immutable object), but can share the same name:

>>> def a(): pass
... 
>>> a
<function a at 0x101c892a8>
>>> def b(): pass
... 
>>> b
<function b at 0x101c89320>
>>> c=a
>>> c
<function a at 0x101c892a8>  # note the physical address is the same as 'a'

So clearly you can do:

>>> c=d=e=f=g=a
>>> e
<function a at 0x101c892a8>

For the case of functions not yet defined, you can use a try/catch block by catching either a NameError:

def default():
    print "default called"

try:
    not_defined()
except NameError:
    default()

Or use a dict of funcs and catch the KeyError:

funcs={"default": default}

try:
    funcs['not_defined']()
except KeyError:
    funcs['default']()      

Or, you can do funcs.get(not_defined, default)() if you prefer that syntax with a dict of funcs.

like image 34
dawg Avatar answered Dec 16 '22 15:12

dawg