prashu
prashu

Reputation: 749

Calling a function from string inside the same module in Python?

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

Answers (2)

Ashwini Chaudhary
Ashwini Chaudhary

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

mgilson
mgilson

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

Related Questions