Рекурсивный поиск по структуре каталогов

Я создал рекурсивную функцию для поиска каталога с ID, который мне нужно использовать:

def find_id(content, id):
    for drive_obj in content:
        print('Got {}'.format(drive_obj.id))
        if drive_obj.id == id:
            print('Find id in {}'.format(drive_obj.id))
            return drive_obj
        elif type(drive_obj) == Directory and drive_obj.children:
            print('{} has children'.format(drive_obj.id))
            return find_id(drive_obj.children, id)

После запуска теста (find_id(example_structure, 'c')) на этой структуре каталогов:

dir_a
-----dir_b
----------file_e
-----dir_c
-----dir_d
dir_f

Logs:
    Got a
    a has children
    Got b
    b has children
    Got e

У меня проблема, потому что функция после нахождения файла с id = e не проверяет следующий dir_c. Вместо продолжения цикла он просто возвращает None. Что-то не так с моей функцией или с моим пониманием / рекурсивными функциями вообще?

вы пробовали os.walk()?

gogaz 10.08.2018 15:10

Есть словарь с объектами каталога, который я получил с Google Диска. А для файловых систем я предпочитаю использовать pathlib;)

Alex 10.08.2018 15:14
0
2
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что у вас return find_id(drive_obj.children, id), даже если вы не можете найти каталог, который ищете:

def find_id(content, id):
    for drive_obj in content:
        print('Got {}'.format(drive_obj.id))
        if drive_obj.id == id:
            print('Find id in {}'.format(drive_obj.id))
            return drive_obj
        elif type(drive_obj) == Directory and drive_obj.children:
            print('{} has children'.format(drive_obj.id))
            result = find_id(drive_obj.children, id)  # Now if find_id returns None, we don't stop
            if result:  # result is not None if your objects can be falsy
                return result

Вы хотите, чтобы find_id возвращал None, если он ничего не находит, и вы хотите, чтобы эти результаты None не передавались вызывающему абоненту.

Большое спасибо. Слишком много времени было потрачено на такую ​​глупую ошибку.

Alex 10.08.2018 15:16

Другие вопросы по теме