46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
from six import string_types
|
||
|
|
||
|
import copy
|
||
|
import json
|
||
|
|
||
|
|
||
|
class UtilityDict(dict):
|
||
|
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
super(UtilityDict, self).__init__(*args, **kwargs)
|
||
|
|
||
|
@classmethod
|
||
|
def cast(cls, value):
|
||
|
if isinstance(value, dict) and not isinstance(value, cls):
|
||
|
return cls(value)
|
||
|
else:
|
||
|
return None
|
||
|
|
||
|
def clean(self, strings=True, dicts=True, lists=True):
|
||
|
keys = list(self.keys())
|
||
|
for key in keys:
|
||
|
value = self.get(key, None)
|
||
|
if not value:
|
||
|
if value is None or \
|
||
|
strings and isinstance(value, string_types) or \
|
||
|
dicts and isinstance(value, dict) or \
|
||
|
lists and isinstance(value, (list, tuple, )):
|
||
|
del self[key]
|
||
|
|
||
|
def deepcopy(self):
|
||
|
return copy.deepcopy(self)
|
||
|
|
||
|
@staticmethod
|
||
|
def dump(data):
|
||
|
def encoder(obj):
|
||
|
json_types = (bool, dict, float, int, list, tuple, ) + string_types
|
||
|
if not isinstance(obj, json_types):
|
||
|
return str(obj)
|
||
|
return json.dumps(data, indent=4, sort_keys=True, default=encoder)
|
||
|
|
||
|
def dump_items(self, key=None):
|
||
|
return self.dump(self.get(key) if key else self)
|
||
|
|