2014-10-08 50 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,我会提醒你不要使用全局map_str。

+0

在这种情况下需要注意使用全局的东西是什么? – user3590149 2014-10-08 16:32:40

+0

一般而言,全局变量可能会超出函数的范围,从而使代码难以推理。在这种情况下,你必须确保map_str在你的函数调用之间得到适当的重置。如果你像上面一样使用'depth',你可以像'if depth == 0:map_str ='“'一样放入一行,这会使它更安全,更不容易出错。 – Gretchen 2014-10-09 16:23:21