Рассмотрим простую функцию:
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
пустым или нет, если так, то сохранить его содержимое в файл, и может быть ... чтобы все повторить заново, чтобы накопить другое значение?
Что является подходящим шаблоном проектирования, когда я хотел бы накапливать возвращаемые значения некоторой функции за несколько итераций «извне», не передавая некоторый список вглубь кода, а затем возвращаясь к нему без единого глобального списка, который затем должен быть сброшен без входа в какой-либо искусственный текстовый файл, который затем должен быть проанализирован (может быть, я хочу записать в память и что-то с ним сделать, а не записать на диск?).
** Редактировать: ** Одна идея, которую я рассмотрел, которая имеет много смысла, но я не знаю, как реализовать, это написать сценарий для запуска всего моего проекта, соблюдая при этом значения локального переменная во время выполнения. Они будут собраны, и я буду делать с ними все, что мне нравится. Для этого мне нужно иметь возможность наблюдать значения локальной переменной (возвращаемых значений некоторой функции, встроенной глубоко в код) во время выполнения. Может быть, я мог бы сделать это с помощью модуля байт-кода . Я не знаю. Я смотрю на это. Одним из преимуществ этого подхода является то, что мне не нужно менять ни одной строки кода в моем проекте - весь процесс накопления происходит в сценарии, охватывающем весь проект.