2

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

我所关心的是找到使代码尽可能优雅的方法 - 简单易懂 - 特别是对于非技术观众。

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

虽然'很高兴',但我并不特别关心存储操作的原子性,也不是强烈保护存储的值不丢失[尽管我确实需要它在服务器重新启动时持续存在]。

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

存储单个(数字)值以使其在脚本执行之间持续存在的最优雅(和/或最 Pythonic)的方式是什么?

4

3 回答 3

4

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

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

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

于 2020-05-29T21:11:15.057 回答
1

这是对“写入文本文件”方法的一种看法:

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))

这里失去优雅之处在于需要将变量从 a 转换为 a str,但很明显,您正在从磁盘上的文件中写入和读取。

于 2020-05-29T22:43:31.613 回答
0

我的问题中提到的泡菜方法是:

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 模块的作用。

于 2020-05-29T21:53:23.043 回答