Как мне перебрать серию функций в Django?

У меня есть очень большая функция, которую я разбиваю на более мелкие функции. В настоящее время это выглядит так:

def big_function():
    # process1
    # process2
    # process3
    # process4
    # process5
    # process6
    # etc....

Как только я разберу функции, я захочу применить их одну за другой. Вместо того, чтобы вызывать каждую функцию по порядку, есть ли способ перебирать их одну за другой? Что-то типа:

def iterate_through_functions:
    for function in functions:
        # run each process function in order

    def process1():
        # do something
    def process2():
        # do something
    def process3():
        # do something
    def process4():
        # do something
    def process5():
        # do something
    def process6():
        # do something
    def etc....():
        # do something

person YPCrumble    schedule 27.02.2014    source источник
comment
Может быть: functions = [process1, process2, ...] затем повторить...   -  person mshsayem    schedule 27.02.2014
comment
Меня смущает это предложение, которое звучит так же, как и в приложении: вместо того, чтобы вызывать каждую функцию по порядку, есть ли способ перебирать их одну за другой? Разве это не одно и то же?   -  person erewok    schedule 27.02.2014
comment
Я имею в виду, что если бы у меня было, скажем, пятнадцать функций, мне просто нужно было бы написать имя каждой функции и вызвать ее, и это похоже на много ручного письма, которое не сокращается простым написанием их по отдельности в виде списка. Если я динамически генерирую список, это работает, но как мне повторять эти функции?   -  person YPCrumble    schedule 27.02.2014


Ответы (3)


Возможно, путаница в том, как вызывать функции во время итерации?

def function1():
    print 'function1'

def function2():
    print 'function2'

functions = [function1, function2]

for function in functions:
    function()
person Soytoise    schedule 27.02.2014

Комментарий Mshsayem о том, что вы можете просто создать список функций и выполнить итерацию, является правильным. Однако для удобочитаемости и отладки вам почти наверняка лучше просто вызывать каждую функцию явно, если только вы не создаете функции динамически и не знаете, сколько их будет.

person rmehlinger    schedule 27.02.2014

Вы можете использовать locals() для запуска произвольного набора именованных функций из списка, подобного этому:

def x():
    print "x"
def y():
    print "y"
def z():
    print "z"

for fxn in ['x','y','z']:
     locals()[fxn]()

Используя этот подход, вы сможете разработать настраиваемый список процессов.

Редактировать:

Это хорошо, если вы знаете названия функций. Если вы просто хотите запустить функции, которые вы собрали, вы можете просто перебирать их из списка.

for fxn in [x,y,z]:
   fxn()

Причина использования первого подхода заключается в том, что вы можете программно создать список функций с помощью текстового шаблона, например запускать все функции, начинающиеся с «foo_» или «bar_». Если вы просто собираете обратные вызовы, используйте второй подход.

person joel3000    schedule 27.02.2014
comment
Это лучший способ повторить функции в соответствии с комментарием mshsayem? - person YPCrumble; 27.02.2014