2010-08-27 88 views
1

我有这样的方法:的Python - 约法很迷茫,while循环

def is_active(self): 
    if self.is_current_node(): 
     return True 
    cur_children = self.get_children() 
    while cur_children is not None: 
     for child in cur_children: 
      if child.is_current_node(): 
       return True 
      raise Exception(child.display_name) 
     cur_children = cur_children.get_children() 
    return False 

我把这个方法和我一起把raise Exception(child.display_name)来测试和“警报()”我这孩子被打。这个例外从未被提出。你会认为这是因为函数在if child.is_current_node()部分返回了True。那么,如果我用if部分替换为:

 for child in cur_children: 
      if child.is_current_node(): 
       raise Exception(child.display_name) 

它并没有引发异常。但是,如果我这样做:

 for child in cur_children: 
      raise Exception(child.display_name) 

引发异常。我很困惑。我敢肯定,这是荒谬的,但我一直持续到2岁,并且我不能够直白地思考我的小脑袋。

+0

'is_current_node'方法中有什么? – 2010-08-27 19:12:21

+0

它只是针对'self._url'检查一个静态值,并将比较结果作为布尔值返回。 – orokusaki 2010-08-27 19:13:40

+0

@Eric - 不应该在前两个版本中的任何一个中始终提出异常?第二个说:“如果是真的:提高”,并且不从函数返回。第一个说'raise',如果没有'如果True:'从函数返回。 – orokusaki 2010-08-27 19:15:56

回答

1

一些想法:

cur_children = self._children 而cur_children不无: 儿童在cur_children: 如果child.is_current_node(): 返回True 引发异常(child.display_name) cur_children = cur_children._children

我认为self._children包含多个孩子:[A, B, C]

然后,在第一个循环中,将需要A。我们假设A有这些孩子:[AA, AB, AC]。

现在,您可以这样做:cur_children = cur_children._children。这意味着现在,将不会继续使用来自inital [A, B, C]B,而是继续使用AA,依此类推。

在这个例子中,它永远不会达到B。这是打算?


你的is_current_node()包含什么?可能你忘了返回一个值,所以结果总是None,bool(None) == False


另一个想法:(递归)

def is_active(self): 

    def check_children(children): 
     for child in children: 
      if child.is_current_node(): 
       return True 
      else: 
       if children._children: 
        return check_children(children._children) 
     return False 

    if self.is_current_node(): 
     return True 
    return check_children(children) 
+0

谢谢,但在你的例子中'children'定义或传入函数的位置在哪里?你的意思是:'返回check_children(self.children)',还是我错过了什么?由于某种原因,树遍历对我来说非常混乱。 – orokusaki 2010-09-06 04:08:07

0

也许is_current_node总是返回True并且is_current_tab总是返回False?我认为需要更多的背景来给你一个答案。

我能想到的唯一的事情是is_current_node改变状态。

+0

哎呀,看我的编辑。我在编辑时更改了名称。对不起,它们都是相同的功能。 – orokusaki 2010-08-27 19:12:22

2

如果在列表.is_current_node()的第一个孩子,那么异常将永远不会在你的第一个片段提高。

您拥有的任何证据都支持self.is_current_node()始终为true或第一个扫描的子节点为.is_current_node()的想法。鉴于第三个代码片段,后者似乎就是这种情况。

编辑:消除误会(儿=自我!):/

其实,我要问,这是什么应该做的?它看起来像递归树遍历,但它不是那里。 (特别是cur_children = cur_children.get_children()行有点奇怪)