Не работает ли shelve
режим только для чтения? В документации сказано, что параметр flag
работает так, как указано в dbm.open
, поэтому я подумал, что если я открою в режиме чтения, я не смогу изменить объект полки.
Страница здесь также предполагает, что изменение объекта полки, открытого как доступное только для чтения, должно вызывать исключение. Но я все еще могу сделать следующее:
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.
С 3.7.2 в Ubuntu 18.04, все выходит из строя. Если имя файла имеет расширение «.db», оно дает:
dbm.error: db type is dbm.gnu, but the module is not available
и без расширения режим только для чтения не работает.