2014-10-08 2 views
0

У меня есть этот код, который выполняет рекурсию, но я хочу, чтобы иметь возможность смотреть рекурсии, но иллюстрировать глубину каждой рекурсии, а также когда она возвращается. Просто что-то простое, как показано ниже. Не знаю, где мне нужно помещать пробелы или вкладки, чтобы это произошло, и я использую строку map_str, а затем распечатываю ее в конце. См. Код и пример вывода.Python - распечатать визуальную трассировку рекурсии

def get_process_parents(batchDate, late_process): 
    global late_parents 
    global map_str 
    process_depends = [] 
    #logging.info('late_process: %s ' % late_process) 
    process_depends = getprocessDependencies(batchDate, late_process) 
    late_parents[late_process.get('name')] = process_depends 
    map_str += (' %s ---> %s \n------>\n' % (late_process.get('name'), process_depends)) 
    #logging.info('Late_process Name: %s ---> Depends: %s ' % (late_process.get('name'),process_depends)) 
    if not process_depends: 
     #logging.info('No more depends: %s' % late_process.get('name')) 
     late_parents_process.add(late_process.get('name')) 
     map_str += (' %s ---> %s\n ---->\n' % (late_process.get('name'), process_depends)) 
    else: 
     for process_depend in process_depends: 
      process = getprocessByName(batchDate, process_depend) 
      #logging.info('process_depend %s --> state: %s ' % (process_depend, process.get('state'))) 
      if process.get('state') == 'Done': 
       #logging.info('process depend DONE: %s' % process_depend) 
       map_str += (' %s Status: %s\n ---->\n' % (process_depend, process.get('state'))) 

      else: 
       late_parents_process.add(process.get('name')) 
       get_process_parents(batchDate, getprocessByName(batchDate,process_depend)) 

Выход:

То, что я хочу, чтобы это выглядело как

Process_name ----> ['process dependencies 1', 'process dependencies 2'] 
------>process dependencies 1 ----> [process dependencies 3, dependencies 4] 
     ------>dependencies 3 -----> [] 
     ------>dependencies 4 -----> [] 
------>process dependencies 2 ----> [process dependencies 5] 
     ------>process dependencies 5 -----> [process dependencies 6] 
       ----->process dependencies 6 -----> [] 

ответ

1

Можете ли вы изменить сигнатуру функции? Если это так, то проще всего было бы определить функцию, как:

def get_process_parents(batchDate, late_process, depth=0): 

, а затем в ваши вложенные вызовы используют

get_process_parents(batchDate, getprocessByName(batchDate,process_depend), depth + 1) 

Затем, чтобы отступы, вы можете использовать:

print '\t' * depth + ('%s---->... # etc, etc 

Я бы предостерег от использования глобального для map_str, если вы можете его избежать.

+0

Что это такое, чтобы использовать глобальный подход в этом контексте? – user3590149

+0

В общем, глобальные переменные, которые могут меняться вне сферы вашей функции, делают ваш код сложнее рассуждать. В этом случае вы должны убедиться, что map_str получает правильный сброс между вызовами вашей функции. Если вы используете 'depth', как указано выше, вы можете поместить строку, подобную 'if depth == 0: map_str =" "', что сделало бы ее более безопасной и подверженной ошибкам. – Gretchen

Смежные вопросы