Python `shelve` режим только для чтения не работает - PullRequest
2 голосов
/ 24 марта 2019

Не работает ли 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

и без расширения режим только для чтения не работает.

1 Ответ

0 голосов
/ 25 марта 2019

Я отследил это до использования ndbm, gdbm или dumb в реализации .В дистрибутиве, в котором используется модуль ndbm или gdbm, открытие с flag='r' работает как положено.Однако (по крайней мере в Ubuntu 18.04 с Python 3.7.2 от Anaconda), если используется dumb, то поведение такое же, как и в вопросе выше, и флаг только для чтения не предотвращает запись.

По какой-то причине Анаконда не использовала python3-gdbm, установленный в системе.Копирование библиотеки из системных файлов в среду anaconda, как указано здесь , решило эту проблему.

...