我有这个方法:
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)
测试出去,然后“警告()”告诉我哪个孩子被击中了。永远不会引发异常。您认为这是因为函数在True
部分返回if child.is_current_node()
。好吧,如果我用这个替换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 :(得分:2)
如果列表.is_current_node()中的第一个子节点,则永远不会在您的第一个片段中引发异常。
您拥有的所有证据都支持self.is_current_node()始终为true或第一个扫描子.is_current_node()的想法。鉴于第三个代码片段,后者似乎就是这种情况。
编辑:消除误解(孩子!=自我):/
实际上,我不得不问,这应该做什么?它看起来有点像递归树遍历,但它并不完全存在。 (cur_children = cur_children.get_children()行特别有点奇怪)
答案 1 :(得分:1)
一些想法:
cur_children = self._children 而cur_children不是None: 对于孩子在cur_children: if 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
。这意味着现在,不是继续使用B
中的[A, B, C]
,而是继续使用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)
答案 2 :(得分:0)
也许is_current_node总是返回True而is_current_tab总是返回False?我认为需要更多的背景来给你一个答案。
我唯一能想到的是is_current_node改变状态。