Reputation: 749
Lets say I have a function bar
inside a module called foo.py
. Somewhere inside foo.py, I want to be able to call bar() from the string "bar". How do I do that?
# filename: foo.py
import sys
def bar():
print 'Hello, called bar()!'
if __name__ == '__main__':
funcname = 'bar'
# Here I should be able to call bar() from funcname
I know that there exists some built-in function in python called 'getattr'. However, it requires 'module object' to be the first parameter. How to obtain the 'module object' of the current module?
Upvotes: 28
Views: 17271
Reputation: 250991
Use a dictionary that keeps the mapping of functions you want to call:
if __name__ == '__main__':
funcnames = {'bar': bar}
funcnames['bar']()
Upvotes: 21
Reputation: 309949
globals
is probably easier to understand. It returns the current module's __dict__
, so you could do:
func_I_want = globals()['bar'] #Get the function
func_I_want() #call it
If you really want the module object, you can get it from sys.modules
(but you usually don't need it):
import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
Note that in general, you should ask yourself why you want to do this. This will allow any function to be called via a string -- which is probably user input... This can have potentially bad side effects if you accidentally give users access to the wrong functions.
Upvotes: 45