存储(持久化)单个(数字)变量值的最优雅方式

Most elegant way to store (persist) the value of a single (numeric) variable

我需要在脚本执行之间存储一个计数器的值,这样我就可以在每百次计数时触发一个特定的子例程。我知道我可以将我的整数写入一个文本文件并重新读取它,我知道我可以 pickle 我的变量达到几乎相同的效果(脚本当前使用后一种方法)。

我关心的是找到使代码尽可能优雅(简单易懂)的方法,尤其是对非技术人员而言。

pickle 模块名称在这方面没有帮助 - 一旦理解了这个比喻,它就完全令人难忘,但如果您不知道,则需要注释(或口头解释)以说明它是一个用于将 Python 对象序列化到磁盘的模块。

虽然 'nice to have',但我并不是特别关心存储操作的原子性,也不是特别关心保护存储值免于丢失 [尽管我确实需要它在服务器重启后仍然存在]。

我感兴趣的是访问和更新变量值的代码的优雅性,而不是 初始化 存储值的代码的优雅性(因此,如果值是要存储在文件中,我对读取和写入已存在并保存值的文件的代码感兴趣,而不是在第一次执行时创建文件)。

存储单个(数字)值使其在脚本执行之间持续存在的最优雅(and/or 最 pythonic)方法是什么?

标准库的 shelve 模块正是为这个用例设计的:对象持久化。在这里你可以简单地做:

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

它将自动创建该文件并将计数器的值存储在其中。

我的问题中提到的 pickle 方法是:

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 模块的功能。

这是对 'write to a text file' 方法的一种尝试:

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 转换为 str,但很明显,您正在对磁盘上的文件进行写入和读取。