
def filterDictToStr(filterDict):
    return ', '.join(['%s=%s' %(key, repr(value)) for key, value in filterDict.items()])

class DataObject(object):

    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)

    def __str__(self):
        return 'DataObject( %s )' %(', '.join(['%s=%s' %(key, repr(value)) for key, value in self.__dict__.items()]))

    __repr__ = __str__

@@ -424,8 +424,618 @@
 __str__%0A
+%0A%0Aclass hashableDict(dict):%0A    '''%0A        A dict that is hashable.%0A    '''%0A%0A    def __hash__(self):%0A        KEYVAL_SEP = '~~..~~'%0A        NONEVAL='~~__NONE$$zz'%0A%0A        PAIRS_SEP='88ascvjikZZ'%0A%0A        hashableStr = %5B%5D%0A%0A        keys = list(self.keys())%0A        keys.sort()%0A%0A        for key in keys:%0A            value = self%5Bkey%5D%0A%0A            if value is None:%0A                value = NONEVAL%0A            else:%0A                value = str(value)%0A%0A            hashableStr.append(key + KEYVAL_SEP + value)%0A%0A        hashableStr = PAIRS_SEP.join(hashableStr)%0A%0A        ret = hash(hashableStr)%0A        return ret%0A%0A

Add a hashable-dict type for testing