Самый элегантный способ сохранить (сохранить) значение одной (числовой) переменной

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

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

В pickle имя модуля бесполезно в этом отношении - как только вы разобрались с метафорой, она полностью запоминается, но если вы этого не знаете, требуется комментарий (или словесное объяснение), чтобы объяснить, что это модуль для сериализации объектов Python для диск.

Хотя это "приятно иметь", меня не особо беспокоит атомарность операции хранения или строгая защита сохраненного значения от потери [хотя мне действительно нужно, чтобы оно сохранялось при перезагрузке сервера].

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

Каков наиболее элегантный (и / или наиболее питонический) способ сохранить одно (числовое) значение, чтобы оно сохранялось между выполнениями скрипта?

3 ответа

Решение

В shelve Модуль стандартной библиотеки был разработан именно для этого варианта использования: постоянство объекта. Здесь можно просто:

with shelve.open('counter') as db:
    db['value'] = counter

Он автоматически создаст этот файл и сохранит в нем значение счетчика.

Это подход к "записи в текстовый файл":

with open('counter', 'r') as f:
    value = int(f.read())
# Perform increments to the counter 'value' here
with open('counter', 'w') as f:
    f.write(str(value))

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

Подход с рассолом, упомянутый в моем вопросе:

import pickle
with open('counter', 'rb') as f:
    value = pickle.load(f)    
# Perform increments to the counter 'value' here
with open('counter', 'wb') as f:
    pickle.dump(value, f)

Потеря элегантности здесь заключается в необходимости знать, что делает модуль pickle.

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