Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

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?

share|improve this question

3 Answers 3

up vote 13 down vote accepted

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.

share|improve this answer

Use a dictionary that keeps the mapping of functions you want to call:

if __name__ == '__main__':
  funcnames = {'bar': bar}
  funcnames['bar']()
share|improve this answer
    
I always appreciate an answer that solves the OP's problem rather than her/his question. +1 –  gboffi Nov 12 '14 at 10:35

How about this:

eval('bar' + '()')
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.