gpt4 book ai didi

Python `shelve` 只读模式不工作

转载 作者:行者123 更新时间:2023-11-28 18:58:38 25 4
gpt4 key购买 nike

shelve只读模式坏了?文档说 flag 参数按照 dbm.open 中的说明工作。所以我想如果我在阅读模式下打开我不应该能够改变搁置对象。

页面here似乎还建议修改以只读方式打开的搁置对象应该引发异常。但我仍然能够执行以下操作:

Python 3.7.2 (default, Dec 29 2018, 06:19:36) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import shelve
>>> with shelve.open('testdata') as shelf:
... shelf['two'] = 2222
... shelf['one'] = 1111
...

接下来我将使用 flag='r'writeback=False 打开它只是为了确定。但我能够修改对象。

>>> with shelve.open('testdata', flag='r', writeback=False) as shelf:
... for k, v in shelf.items():
... print('Key: ', k, ' Value: ', v)
... shelf['two'] = 1111
... shelf['one'] = 2222
...
Key: one Value: 1111
Key: two Value: 2222

只是为了确认,打开并再次打印出来显示对象确实发生了变化:

>>> with shelve.open('testdata', flag='r', writeback=False) as shelf:
... for k, v in shelf.items():
... print('Key: ', k, ' Value: ', v)
...
Key: one Value: 2222
Key: two Value: 1111

我错过了什么?这可能与 dbm 在不同系统上的选择/实现有关吗?在链接页面上运行代码也不会导致:ERROR: cannot add item to database 正如页面所说的那样。

更新:链接页面中的代码按预期工作,即引发和错误,我使用较早版本的 Python 时,即:

Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

以及在 MacOS 上:

Python 3.6.5 |Anaconda, Inc.| (default, Apr 26 2018, 08:42:37)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

在 Ubuntu 18.04 上使用 3.7.2,事情就崩溃了。如果文件名有扩展名“.db”,它给出:

dbm.error: db type is dbm.gnu, but the module is not available

如果没有扩展名,只读模式将不起作用。

最佳答案

我将其追踪到在 implementation 中使用 ndbmgdbmdumb .在使用 ndbmgdbm 模块的发行版上,以 flag='r' 开头的模块按预期工作。但是,(至少在 Ubuntu 18.04 和 Anaconda 的 Python 3.7.2 上)如果正在使用 dumb,则行为与上面的问题相同,只读标志不会阻止写入。

出于某种原因,Anaconda 没有使用系统上安装的 python3-gdbm。如前所述将库从系统文件复制到 anaconda 环境 here解决了这个问题。

关于Python `shelve` 只读模式不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55319347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com