10.2 创建shelf

    创建shelf的第1个部分用模块级别的函数——shelve.open()来完成,这个函数用于创建一个持久化的shelf结构。第2个部分是正确地关闭文件,这样所有的改变才能被正确地保存到文件系统中。之后我们会用一个更完整的例子来展示这种方法。

    实际上,shelve模块用了dbm模块完成打开文件和映射键值的工作。dbm模块自身封装了底层与DBM兼容的库。因此,实现shelve的功能有一些不同方法可以选择,对于不同的dbm实现时的不同点无关紧要。

    shelve.open()函数需要两个参数:文件名和文件访问模式。通常,我们用默认的'c'模式打开一个已经存在的shelf,或者当找不到指定的shelf时就创建一个新的。其他的模式主要用于一些特定的情况。

    • 'r'是以只读方式打开shelf。
    • 'w'必须指定一个已经存在的可读写shelf,否则程序会抛出异常。
    • 'n'创建一个新的空shelf;任何之前的版本都会被覆盖。

    关闭shelf是非常必要的,因为这样才能确保它被正确地写入到磁盘中。shelf本身不是上下文管理器,但是我们可以用contextlib.closing()函数确保shelf被关闭。关于上下文管理器的更多内容,参见第5章“可调用对象和上下文的使用”。

    在一些情况下,我们可能也想显式地将shelf同步到磁盘,但是不关闭文件。shelve. sync()方法会在关闭之前保存改变。理想的生命周期会类似下面的代码这样。

    import shelve
    from contextlib import closing
    with closing( shelve.open('some_file') ) as shelf:
      process( shelf )

    打开一个shelf,然后将它提供给应用程序中那些真正完成需求的函数使用。当这个过程完成后,这个上下文可以确保shelf被关闭。如果process()函数抛出一个异常,shelf仍然会被正确地关闭。