Skip to content

Instantly share code, notes, and snippets.

@soldni
Last active August 29, 2015 14:14
Show Gist options
  • Save soldni/f0d8f4b6c51866e6cac9 to your computer and use it in GitHub Desktop.
Save soldni/f0d8f4b6c51866e6cac9 to your computer and use it in GitHub Desktop.
Wrapper around shelve.DbfilenameShelf that ensure Unicode strings are properly encoded/decoded before being inserted/after being extracted from the database.
#!/usr/bin/python
import shelve
class UnicodeShelve(shelve.DbfilenameShelf, object):
"""Wrapper around shelve.DbfilenameShelf that ensure unicode strings
are properly encoded/decoded before being insered/after being extracted
from the database."""
def __deep_convert(self, it, decode=False):
if isinstance(it, list):
return [self.__deep_convert(e) for e in it]
if isinstance(it, tuple):
return tuple([self.__deep_convert(e) for e in it])
if isinstance(it, dict):
return {self.__deep_convert(k):self. __deep_convert(v)
for k, v in it.iteritems()}
try:
return it.encode('utf-8') if not decode else it.decode('utf-8')
except AttributeError:
return it
def __setitem__(self, key, val):
key_enc = self.__deep_convert(key)
val_enc = self.__deep_convert(val)
super(UnicodeShelve, self).__setitem__(key_enc, val_enc)
def __getitem__(self, key):
key_enc = self.__deep_convert(key)
val_enc = super(UnicodeShelve, self).__getitem__(key_enc)
return self.__deep_convert(val_enc, decode=True)
def __contains__(self, value):
value_enc = self.__deep_convert(value)
return super(UnicodeShelve, self).__contains__(value_enc)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment