Python Language Réécrire


Exemple

Les étagères ne suivent pas les modifications apportées aux objets volatils, par défaut. Cela signifie que si vous modifiez le contenu d'un élément stocké dans l'étagère, vous devez mettre à jour l'étagère explicitement en stockant à nouveau l'élément.

import shelve

s = shelve.open('test_shelf.db')
try:
    print s['key1']
    s['key1']['new_value'] = 'this was not here before'
finally:
    s.close()

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
finally:
    s.close()

Dans cet exemple, le dictionnaire de 'key1' n'est plus stocké, de sorte que lorsque la tablette est rouverte, les modifications n'ont pas été conservées.

$ python shelve_create.py
$ python shelve_withoutwriteback.py

{'int': 10, 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'float': 9.5, 'string': 'Sample data'}

Pour capturer automatiquement les modifications apportées aux objets volatiles stockés sur l'étagère, ouvrez l'étagère avec l'écriture différée activée. L'indicateur d'écriture différée oblige l'étagère à mémoriser tous les objets extraits de la base de données à l'aide d'un cache en mémoire. Chaque objet de cache est également réécrit dans la base de données lorsque l'étagère est fermée.

import shelve

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
    s['key1']['new_value'] = 'this was not here before'
    print s['key1']
finally:
    s.close()

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
finally:
    s.close()

Bien que cela réduise le risque d'erreur du programmeur et rend la persistance de l'objet plus transparente, l'utilisation du mode d'écriture différée peut ne pas être souhaitable dans toutes les situations. Le cache consomme de la mémoire supplémentaire lorsque l'étagère est ouverte et la pause pour écrire chaque objet mis en cache dans la base de données à sa fermeture peut prendre plus de temps. Comme il n'y a aucun moyen de savoir si les objets mis en cache ont été modifiés, ils sont tous réécrits. Si votre application lit les données plus qu'elle écrit, l'écriture différée ajoutera plus de données que vous ne le souhaiteriez.

$ python shelve_create.py
$ python shelve_writeback.py

{'int': 10, 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'new_value': 'this was not here before', 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'new_value': 'this was not here before', 'float': 9.5, 'string': 'Sample data'}