Search code examples
pythonfunctional-programminggetattr

How to iterate through a module's functions


I have this function call after importing foo.py. Foo has several methods that I need to call e.g. foo.paint, foo.draw:

import foo

code

if foo:
    getattr(foo, 'paint')()

I need to use a while loop to call and iterate through all the functions foo.paint, foo.draw etc. How do i go about it?


Solution

  • You can use foo.__dict__ somehow like this:

    for name, val in foo.__dict__.iteritems(): # iterate through every module's attributes
        if callable(val):                      # check if callable (normally functions)
            val()                              # call it
    

    But watch out, this will execute every function (callable) in the module. If some specific function receives any arguments it will fail.

    A more elegant (functional) way to get functions would be:

    [f for _, f in foo.__dict__.iteritems() if callable(f)]
    

    For example, this will list all functions in the math method:

    import math
    [name for name, val in math.__dict__.iteritems() if callable(val)]
    ['pow',
     'fsum',
     'cosh',
     'ldexp',
     ...]