human
Complete this python program:
def from_pickle(data, db_obj=None):
assistant
#Here is the Python program you requested.

    """This should be fed a just de-pickled data object. It will be converted back
    to a form that may contain database objects again. Note that if a database
    object was removed (or changed in-place) in the database, None will be
    returned.
    Args_
    data (any): Pickled data to unpickle.
    db_obj (Atribute, any): This is the model instance (normally
    an Attribute) that _Saver*-type iterables (_SaverList etc)
    will save to when they update. It must have a \value\ property
    that saves assigned data to the database. Skip if not
    serializing onto a given object.  If db_obj is given, this
    function will convert lists, dicts and sets to their
    _SaverList, _SaverDict and _SaverSet counterparts.
    Returns:
    data (any): Unpickled data.
    """
    def process_item(item):
        'Recursive    processor    and    identification    of    data'
        dtype = type(item)
        if (dtype in (basestring, int, float, bool)):
            return item
        elif _IS_PACKED_DBOBJ(item):
            return unpack_dbobj(item)
        elif _IS_PACKED_SESSION(item):
            return unpack_session(item)
        elif (dtype == tuple):
            return tuple((process_item(val) for val in item))
        elif (dtype == dict):
            return dict(((process_item(key), process_item(val)) for (key, val) in item.items()))
        elif (dtype == set):
            return set((process_item(val) for val in item))
        elif (dtype == OrderedDict):
            return OrderedDict(((process_item(key), process_item(val)) for (key, val) in item.items()))
        elif (dtype == deque):
            return deque((process_item(val) for val in item))
        elif hasattr(item, '__iter__'):
            try:
                return item.__class__((process_item(val) for val in item))
            except (AttributeError, TypeError):
                return [process_item(val) for val in item]
        return item
    def process_tree(item, parent):
        'Recursive    processor,    building    a    parent-tree    from    iterable    data'
        dtype = type(item)
        if (dtype in (basestring, int, float, bool)):
            return item
        elif _IS_PACKED_DBOBJ(item):
            return unpack_dbobj(item)
        elif (dtype == tuple):
            return tuple((process_tree(val, item) for val in item))
        elif (dtype == list):
            dat = _SaverList(_parent=parent)
            dat._data.extend((process_tree(val, dat) for val in item))
            return dat
        elif (dtype == dict):
            dat = _SaverDict(_parent=parent)
            dat._data.update(((process_item(key), process_tree(val, dat)) for (key, val) in item.items()))
            return dat
        elif (dtype == set):
            dat = _SaverSet(_parent=parent)
           ...