Python - очень запутанный метод и цикл while - PullRequest
1 голос
/ 27 августа 2010

У меня есть этот метод:

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)

Исключение повышено. Я весьма озадачен. Я уверен, что это что-то нелепое, но мне было до двух лет, и я не могу придумать достаточно, чтобы обернуть мой крошечный мозг вокруг этого.

Ответы [ 3 ]

2 голосов
/ 27 августа 2010

Если первый дочерний элемент в списке .is_current_node (), то исключение никогда не будет вызываться в вашем первом фрагменте.

Все, что у вас есть для доказательства, поддерживает идею, что либо self.is_current_node ()всегда true или первый отсканированный дочерний элемент .is_current_node ().Учитывая третий фрагмент кода, последний, кажется, имеет место.

РЕДАКТИРОВАТЬ: устранение недопонимания (child! = Self): /

На самом деле, я должен спросить, что это предполагаетсясделать?Это выглядит неопределенно как рекурсивный обход дерева, но это не совсем так.(строка cur_children = cur_children.get_children (), в частности, немного странная)

1 голос
/ 27 августа 2010

Некоторые идеи:

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)
0 голосов
/ 27 августа 2010

Может быть, is_current_node всегда возвращает True, а is_current_tab всегда возвращает False?Я думаю, что для ответа вам нужно больше контекста.

Единственное, о чем я могу думать, это то, что is_current_node изменяет состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...