Как перебирать функции модуля

У меня есть вызов этой функции после импорта foo.py. У Foo есть несколько методов, которые мне нужно вызвать, например. foo.paint, foo.draw:

import foo

code

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

Мне нужно использовать цикл while для вызова и перебора всех функций foo.paint, foo.draw и т. Д. Как мне это сделать?


person lobjc    schedule 19.02.2014    source источник
comment
Не думаю, что это дубликат. В этом вопросе OP только хотел информацию, в этом он действительно хочет вызвать функции.   -  person Paulo Bu    schedule 19.02.2014


Ответы (1)


Вы можете использовать foo.__dict__ как-то так:

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

Но будьте осторожны, это выполнит каждую функцию (вызываемую) в модуле. Если какая-то конкретная функция получит какие-либо аргументы, она потерпит неудачу.

Более элегантный (функциональный) способ получения функций:

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

Например, здесь будут перечислены все функции в методе math:

import math
[name for name, val in math.__dict__.iteritems() if callable(val)]
['pow',
 'fsum',
 'cosh',
 'ldexp',
 ...]
person Paulo Bu    schedule 19.02.2014
comment
будучи новичком в python, я немного не понимаю, как это реализовать: [f для , f в foo .__ dict_ .iteritems () if callable (f)]. Я получаю AttributeError: объект 'dict' не имеет атрибута 'iteritems' - person lobjc; 20.02.2014
comment
@wakamdr Кажется, вы используете Python 3, попробуйте __dict__.items() - person Paulo Bu; 20.02.2014