Избегайте использования глобальных переменных - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь использовать эту функцию для возврата двух списков, используя класс dircmp из модуля filecmp.

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

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

Для справки функции повторяются одинаково, но они отслеживают другой набор данных, например same_files, которые нужно разделить на same_leftpath_list и same_rightpath_list.

diff_leftpath_list = []
diff_rightpath_list = []

def print_diff_files(dcmp):

    for name in dcmp.diff_files:
        print("[Differing File] '%s' found in %s and %s" % (name, dcmp.left, 
                                                      dcmp.right))
        diff_leftpath = os.path.join(dcmp.left, name)
        diff_rightpath = os.path.join(dcmp.right, name)
        diff_leftpath_list.append(diff_leftpath)
        diff_rightpath_list.append(diff_rightpath)

    for sub_dcmp in dcmp.subdirs.values():
        print_diff_files(sub_dcmp)

print_diff_files(dcmp)
print diff_leftpath_list

1 Ответ

0 голосов
/ 13 июня 2018

Существует два распространенных способа решения вашей проблемы: передача списков в качестве параметров и объединение возвращаемых значений из рекурсивных вызовов.

Вот как можно передать списки в качестве параметров.Мы создаем функцию-обертку, чтобы скрыть детали реализации.

def print_diff_files(dcmp):
    """calls the wrapper to do the real work.  Hides the list management."""
    left = []
    right = []
    _print_diff_files_impl(dcmp, left, right)
    return left, right

def _print_diff_files_impl(dcmp, diff_leftpath_list, diff_rightpath_list):
    for name in dcmp.diff_files:
        print("[Differing File] '%s' found in %s and %s" % (name, dcmp.left, 
                                                      dcmp.right))
        diff_leftpath = os.path.join(dcmp.left, name)
        diff_rightpath = os.path.join(dcmp.right, name)
        diff_leftpath_list.append(diff_leftpath)
        diff_rightpath_list.append(diff_rightpath)
    for sub_dcmp in dcmp.subdirs.values():
        _print_diff_files_impl(sub_dcmp, diff_leftpath_list, diff_rightpath_list)

Вот как вы можете управлять ей с помощью возвращаемых значений.Обычно это лучший подход.

def print_diff_files(dcmp):
    left = []
    right = []
    for name in dcmp.diff_files:
        print("[Differing File] '%s' found in %s and %s" %
              (name, dcmp.left, dcmp.right))
        diff_leftpath = os.path.join(dcmp.left, name)
        diff_rightpath = os.path.join(dcmp.right, name)
        left.append(diff_leftpath)
        right.append(diff_rightpath)
    for sub_dcmp in dcmp.subdirs.values():
        new_left, new_right = print_diff_files(sub_dcmp)
        left.extend(new_left)
        right.extend(new_right)
    return left, right

Если вы хотите стать более изобретательным, вы можете использовать генераторы, но это немного большее изменение в вашем коде.

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