Как накапливать значения локальных переменных - PullRequest
0 голосов
/ 17 сентября 2018

Рассмотрим простую функцию:

def sum(a, b):
    return a + b

Я хотел бы накопить значения sum(), которые вызываются несколько раз, и в конечном итоге сохранить их в файл. Подвох - где накапливать эти значения?

Кто в Python знает, как глобально хранить список значений, которые могут быть извлечены из глубины кода?

Я хочу, чтобы сам мой код не имел состояния, поэтому я не могу накапливать значения в «обычных» файлах проекта. Я также не хочу существенно переписывать какой-либо существующий код для этой цели. Вместо этого у меня есть файл utils.py, который содержит декоратор, который записывает возвращаемое значение sum() в глобальный список accumulate_list в utils.py. Я импортирую этот декоратор везде, где я хочу его использовать. Другая функция в utils.py выполняет операцию над accumulate_list, которая нуждается в аргументах (например, записывает содержимое accumulate_list в файл с указанным путем или генерирует некоторую статистическую величину из его записей) и выполняет clear() на accumulated_list.

Это решение основано на очень хорошем ответе, данном мне на этот вопрос:

Как я могу отслеживать значения локальной переменной в Python?

Однако приведенное выше решение не полностью решает мою проблему по следующим причинам:

  • У меня есть только один accumulate_list, глобальный в utils.py. Но я хочу накапливать несколько возвращаемых значений для нескольких функций таким образом. Мне нужно что-то вроде «экземпляров» моего декоратора, каждый со своим собственным accumulate_list и методом «сохранить и очистить», но я не знаю, где такой класс мог бы быть инициализирован.
  • Явные глобалы безобразны. Может быть, они тоже не пифоничны.
  • Очень искусственно встроить некоторые import decorator где-то глубоко внутри кода, а затем для скрипта, выполняющего код, чтобы проверить, является ли accumulated_list пустым или нет, если так, то сохранить его содержимое в файл, и может быть ... чтобы все повторить заново, чтобы накопить другое значение?

Что является подходящим шаблоном проектирования, когда я хотел бы накапливать возвращаемые значения некоторой функции за несколько итераций «извне», не передавая некоторый список вглубь кода, а затем возвращаясь к нему без единого глобального списка, который затем должен быть сброшен без входа в какой-либо искусственный текстовый файл, который затем должен быть проанализирован (может быть, я хочу записать в память и что-то с ним сделать, а не записать на диск?).

** Редактировать: ** Одна идея, которую я рассмотрел, которая имеет много смысла, но я не знаю, как реализовать, это написать сценарий для запуска всего моего проекта, соблюдая при этом значения локального переменная во время выполнения. Они будут собраны, и я буду делать с ними все, что мне нравится. Для этого мне нужно иметь возможность наблюдать значения локальной переменной (возвращаемых значений некоторой функции, встроенной глубоко в код) во время выполнения. Может быть, я мог бы сделать это с помощью модуля байт-кода . Я не знаю. Я смотрю на это. Одним из преимуществ этого подхода является то, что мне не нужно менять ни одной строки кода в моем проекте - весь процесс накопления происходит в сценарии, охватывающем весь проект.

...