python shelve.open(...,flag='n') 不会创建一个空的架子



我使用的是Python搁置模块和以下Python版本:CCD_ 1。shelve.open方法的标志参数如下所述:

可选标志参数与dbm.open().的标志参数具有相同的解释

dbm标志参数描述如下:

'n'总是创建一个新的空数据库,打开以读取和写入

但以下程序并没有像我预期的那样工作:

导入搁置导入操作系统导入os.path进口百叶窗myshelvedir='C:\\testdir'myshelvefile=os.path.join(myshelvedir,'myshelve')os.mkdir(myshelvedir)尝试:myshelve=shelve.open(myshelvefile)尝试:myshelve['key1']='value1'打印(1,dict(myshelve))最后:myshelve.close()myshelve=shelve.open(myshelvefile,'n')尝试:myshelve['key2']='value2'打印(2,dict(myshelve))最后:myshelve.close()最后:shutil.rmtree(myshelvedir)

输出为

1{"key1":"value1"}2{'key1':'value1','key2':'value2'}

对于第二行,我预计

2{"key2":"value2"}

因为搁置是用CCD_ 2标志打开的,因此数据库在打开后应该是空的。

我错过什么了吗?

附加测试:

关于

Python 3.0.1 (r301:69561, Feb 13 2009, 20:04:18) [MSC v.1500 32 bit (Intel)] on win32

我也有

2 {'key2': 'value2', 'key1': 'value1'}

关于

Python 2.6.4 (r264:75706, Jun 27 2012, 05:45:50) [C] on sunos5

我得到了预期的

(2, {'key2': 'value2'})

也在Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win 32

我得到

(2, {'key2': 'value2'})

因此,这是3 中的一个新功能或错误

我找到了http://bugs.python.org/issue18039.

标题:dbm.open(…,flag="n")不工作,并且不会发出警告

这给出了一个解释。

文档中说shelve使用了一个可用的数据库接口。

http://docs.python.org/3/library/shelve.html

1.3.shelve--Python对象持久性

搁置打开(文件名,标志='c',协议=无,写回=假)
打开一本持久词典

可选标志参数与dbm.open()的标志参数具有相同的解释。

12.3.1.限制将使用哪个数据库包(如dbm.dbm或dbm.gnu)取决于可用的接口。因此,直接使用dbm打开数据库是不安全的。

并且'n'标志的工作方式与dbm.open 类似

http://docs.python.org/3/library/dbm.html

12.5.dbm--Unix"数据库"的接口
dbm是dbm数据库变体dbm.gnu或dbm.nddm的通用接口。如果没有安装这些模块,则将使用模块dbm.dunb中缓慢但简单的实现

'n':始终创建一个新的空数据库,打开以读取和写入

但是,如果n标志回到dbms.dumb ,则n标志的定义与n标志的含义相矛盾

http://docs.python.org/3/library/dbm.html#module-dbm.gnu

12.5.1.dbm.gnu——gnu对dbm的重新解释
平台:Unix

http://docs.python.org/3/library/dbm.html#module-dbm.dumb说

12.5.3.dbm.dumb--可移植dbm实现

dbm.dumm.open(filename[,flag[,mode]])。。。可选标志参数当前被忽略;数据库总是打开以进行更新,如果数据库不存在,则会创建该数据库。

因此,在安装了gnu.dbm库的Unix实现中,这可能不是一个问题(我无法访问Unix上的python 3来测试这一点)

由此,我得出结论,python文档中存在一些相互矛盾的语句:在安装了dbm库的unix系统上,python shelve将使用此dbm安装,此处的"n"标志如文档中所述工作。

如果找不到dbm安装(例如在windows系统上),则在"n"与"c"标志类似的位置将使用dbm.dumb模块。

最新更新