Last active
August 29, 2015 14:14
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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