def save_global(self, obj, name=None, **kwargs): module = getattr(obj, '__module__', None) if module == '__main__': warnings.warn( MAIN_MODULE_WARNING.format(kwargs.get('name', obj.__name__)) ) _Pickler.save_global(self, obj, name=name, **kwargs)
def save_function(pickler, obj): if not _locate_function(obj): #, pickler._session): log.info("F1: %s" % obj) if getattr(pickler, '_recurse', False): # recurse to get all globals referred to by obj from .detect import globalvars globs = globalvars(obj, recurse=True, builtin=True) # remove objects that have already been serialized #stacktypes = (ClassType, TypeType, FunctionType) #for key,value in list(globs.items()): # if isinstance(value, stacktypes) and value in stack: # del globs[key] # ABORT: if self-references, use _recurse=False if obj in globs.values(): # or obj in stack: globs = obj.__globals__ if PY3 else obj.func_globals else: globs = obj.__globals__ if PY3 else obj.func_globals #stack.add(obj) if PY3: pickler.save_reduce(_create_function, (obj.__code__, globs, obj.__name__, obj.__defaults__, obj.__closure__, obj.__dict__), obj=obj) else: pickler.save_reduce(_create_function, (obj.func_code, globs, obj.func_name, obj.func_defaults, obj.func_closure, obj.__dict__), obj=obj) log.info("# F1") else: log.info("F2: %s" % obj) StockPickler.save_global(pickler, obj) #NOTE: also takes name=... log.info("# F2") return
def save_function(pickler, obj): if not _locate_function(obj): #, pickler._session): log.info("F1: %s" % obj) if getattr(pickler, '_recurse', False): # recurse to get all globals referred to by obj from .detect import globalvars globs = globalvars(obj, recurse=True, builtin=True) if obj in globs.values(): #ABORT: use _recurse=False globs = obj.__globals__ if PY3 else obj.func_globals else: globs = obj.__globals__ if PY3 else obj.func_globals if PY3: pickler.save_reduce(_create_function, (obj.__code__, globs, obj.__name__, obj.__defaults__, obj.__closure__, obj.__dict__), obj=obj) else: pickler.save_reduce(_create_function, (obj.func_code, globs, obj.func_name, obj.func_defaults, obj.func_closure, obj.__dict__), obj=obj) else: log.info("F2: %s" % obj) StockPickler.save_global(pickler, obj) #NOTE: also takes name=... return
def save_function(pickler, obj): if not _locate_function(obj): #, pickler._session): log.info("F1: %s" % obj) if getattr(pickler, '_recurse', False): # recurse to get all globals referred to by obj from .detect import globalvars globs = globalvars(obj, recurse=True) else: globs = obj.__globals__ if PY3 else obj.func_globals if PY3: pickler.save_reduce( _create_function, (obj.__code__, globs, obj.__name__, obj.__defaults__, obj.__closure__, obj.__dict__), obj=obj) else: pickler.save_reduce( _create_function, (obj.func_code, globs, obj.func_name, obj.func_defaults, obj.func_closure, obj.__dict__), obj=obj) else: log.info("F2: %s" % obj) StockPickler.save_global(pickler, obj) #NOTE: also takes name=... return
def save_builtin_method(pickler, obj): if obj.__self__ is not None: log.info("B1: %s" % obj) pickler.save_reduce(_get_attr, (obj.__self__, obj.__name__), obj=obj) else: log.info("B2: %s" % obj) StockPickler.save_global(pickler, obj) return
def save_classobj(pickler, obj): if obj.__module__ == '__main__': #XXX: use _main_module.__name__ everywhere? log.info("C1: %s" % obj) pickler.save_reduce(ClassType, (obj.__name__, obj.__bases__, obj.__dict__), obj=obj) #XXX: or obj.__dict__.copy()), obj=obj) ? else: log.info("C2: %s" % obj) StockPickler.save_global(pickler, obj) return
def save_type(pickler, obj): #stack.add(obj) #XXX: probably don't need object from all cases below if obj in _typemap: log.info("T1: %s" % obj) pickler.save_reduce(_load_type, (_typemap[obj],), obj=obj) log.info("# T1") elif issubclass(obj, tuple) and all([hasattr(obj, attr) for attr in ('_fields','_asdict','_make','_replace')]): # special case: namedtuples log.info("T6: %s" % obj) pickler.save_reduce(_create_namedtuple, (getattr(obj, "__qualname__", obj.__name__), obj._fields, obj.__module__), obj=obj) log.info("# T6") return elif obj.__module__ == '__main__': if issubclass(type(obj), type): # try: # used when pickling the class as code (or the interpreter) if is_dill(pickler) and not pickler._byref: # thanks to Tom Stepleton pointing out pickler._session unneeded _t = 'T2' log.info("%s: %s" % (_t, obj)) _dict = _dict_from_dictproxy(obj.__dict__) # except: # punt to StockPickler (pickle by class reference) else: log.info("T5: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# T5") return else: _t = 'T3' log.info("%s: %s" % (_t, obj)) _dict = obj.__dict__ #print (_dict) #print ("%s\n%s" % (type(obj), obj.__name__)) #print ("%s\n%s" % (obj.__bases__, obj.__dict__)) for name in _dict.get("__slots__", []): del _dict[name] pickler.save_reduce(_create_type, (type(obj), obj.__name__, obj.__bases__, _dict), obj=obj) log.info("# %s" % _t) # special cases: NoneType elif obj is type(None): log.info("T7: %s" % obj) if PY3: pickler.write(bytes('c__builtin__\nNoneType\n', 'UTF-8')) else: pickler.write('c__builtin__\nNoneType\n') log.info("# T7") else: log.info("T4: %s" % obj) #print (obj.__dict__) #print ("%s\n%s" % (type(obj), obj.__name__)) #print ("%s\n%s" % (obj.__bases__, obj.__dict__)) StockPickler.save_global(pickler, obj) log.info("# T4") return
def save_classobj(pickler, obj): # FIXME: enable pickler._byref # stack.add(obj) if obj.__module__ == "__main__": # XXX: use _main_module.__name__ everywhere? log.info("C1: %s" % obj) pickler.save_reduce(ClassType, (obj.__name__, obj.__bases__, obj.__dict__), obj=obj) # XXX: or obj.__dict__.copy()), obj=obj) ? log.info("# C1") else: log.info("C2: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# C2") return
def save_classobj(pickler, obj): #FIXME: enable pickler._byref #stack.add(obj) if obj.__module__ == '__main__': #XXX: use _main_module.__name__ everywhere? log.info("C1: %s" % obj) pickler.save_reduce(ClassType, (obj.__name__, obj.__bases__, obj.__dict__), obj=obj) #XXX: or obj.__dict__.copy()), obj=obj) ? log.info("# C1") else: log.info("C2: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# C2") return
def save_type(pickler, obj): #stack.add(obj) #XXX: probably don't need object from all cases below if obj in _builtin_typemap: StockPickler.save_global(pickler, obj) elif obj in _typemap: log.info("T1: %s" % obj) pickler.save_reduce(_load_type, (_typemap[obj], ), obj=obj) log.info("# T1") elif obj.__module__ == '__main__': try: # use StockPickler for special cases [namedtuple,] [ getattr(obj, attr) for attr in ('_fields', '_asdict', '_make', '_replace') ] log.info("T6: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# T6") return except AttributeError: pass if issubclass(type(obj), type): # try: # used when pickling the class as code (or the interpreter) if is_dill(pickler) and not pickler._byref: # thanks to Tom Stepleton pointing out pickler._session unneeded _t = 'T2' log.info("%s: %s" % (_t, obj)) _dict = _dict_from_dictproxy(obj.__dict__) # except: # punt to StockPickler (pickle by class reference) else: log.info("T5: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# T5") return else: _t = 'T3' log.info("%s: %s" % (_t, obj)) _dict = obj.__dict__ #print (_dict) #print ("%s\n%s" % (type(obj), obj.__name__)) #print ("%s\n%s" % (obj.__bases__, obj.__dict__)) pickler.save_reduce(_create_type, (type(obj), obj.__name__, obj.__bases__, _dict), obj=obj) log.info("# %s" % _t) # special cases: NoneType elif obj is type(None): log.info("T7: %s" % obj) if PY3: pickler.write(bytes('c__builtin__\nNoneType\n', 'UTF-8')) else: pickler.write('c__builtin__\nNoneType\n') log.info("# T7") else: log.info("T4: %s" % obj) #print (obj.__dict__) #print ("%s\n%s" % (type(obj), obj.__name__)) #print ("%s\n%s" % (obj.__bases__, obj.__dict__)) StockPickler.save_global(pickler, obj) log.info("# T4") return
def save_function(pickler, obj): if not _locate_function(obj): #, pickler._session): log.info("F1: %s" % obj) if PYTHON3: pickler.save_reduce(FunctionType, (obj.__code__, obj.__globals__, obj.__name__, obj.__defaults__, obj.__closure__), obj=obj) else: pickler.save_reduce(FunctionType, (obj.func_code, obj.func_globals, obj.func_name, obj.func_defaults, obj.func_closure), obj=obj) else: log.info("F2: %s" % obj) StockPickler.save_global(pickler, obj) return
def save_builtin_method(pickler, obj): if obj.__self__ is not None: if obj.__self__ is __builtin__: module = 'builtins' if PY3 else '__builtin__' log.info("B1: %s" % obj) else: module = obj.__self__ log.info("B3: %s" % obj) _recurse = pickler._recurse pickler._recurse = False pickler.save_reduce(_get_attr, (module, obj.__name__), obj=obj) pickler._recurse = _recurse else: log.info("B2: %s" % obj) StockPickler.save_global(pickler, obj) return
def save_function(pickler, obj): if not _locate_function(obj): #, pickler._session): log.info("F1: %s" % obj) if PY3: pickler.save_reduce(_create_function, (obj.__code__, obj.__globals__, obj.__name__, obj.__defaults__, obj.__closure__, obj.__dict__), obj=obj) else: pickler.save_reduce(_create_function, (obj.func_code, obj.func_globals, obj.func_name, obj.func_defaults, obj.func_closure, obj.__dict__), obj=obj) else: log.info("F2: %s" % obj) StockPickler.save_global(pickler, obj) #NOTE: also takes name=... return
def save_type(pickler, obj): # stack.add(obj) #XXX: probably don't need object from all cases below if obj in _builtin_typemap: StockPickler.save_global(pickler, obj) elif obj in _typemap: log.info("T1: %s" % obj) pickler.save_reduce(_load_type, (_typemap[obj],), obj=obj) log.info("# T1") elif obj.__module__ == "__main__": try: # use StockPickler for special cases [namedtuple,] [getattr(obj, attr) for attr in ("_fields", "_asdict", "_make", "_replace")] log.info("T6: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# T6") return except AttributeError: pass if issubclass(type(obj), type): # try: # used when pickling the class as code (or the interpreter) if is_dill(pickler) and not pickler._byref: # thanks to Tom Stepleton pointing out pickler._session unneeded _t = "T2" log.info("%s: %s" % (_t, obj)) _dict = _dict_from_dictproxy(obj.__dict__) # except: # punt to StockPickler (pickle by class reference) else: log.info("T5: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# T5") return else: _t = "T3" log.info("%s: %s" % (_t, obj)) _dict = obj.__dict__ # print (_dict) # print ("%s\n%s" % (type(obj), obj.__name__)) # print ("%s\n%s" % (obj.__bases__, obj.__dict__)) pickler.save_reduce(_create_type, (type(obj), obj.__name__, obj.__bases__, _dict), obj=obj) log.info("# %s" % _t) # special cases: NoneType elif obj is type(None): log.info("T7: %s" % obj) if PY3: pickler.write(bytes("c__builtin__\nNoneType\n", "UTF-8")) else: pickler.write("c__builtin__\nNoneType\n") log.info("# T7") else: log.info("T4: %s" % obj) # print (obj.__dict__) # print ("%s\n%s" % (type(obj), obj.__name__)) # print ("%s\n%s" % (obj.__bases__, obj.__dict__)) StockPickler.save_global(pickler, obj) log.info("# T4") return
def save_builtin_method(pickler, obj): if obj.__self__ is not None: if obj.__self__ is __builtin__: module = 'builtins' if PY3 else '__builtin__' _t = "B1" log.info("%s: %s" % (_t, obj)) else: module = obj.__self__ _t = "B3" log.info("%s: %s" % (_t, obj)) _recurse = pickler._recurse pickler._recurse = False pickler.save_reduce(_get_attr, (module, obj.__name__), obj=obj) pickler._recurse = _recurse log.info("# %s" % _t) else: log.info("B2: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# B2") return
def save_function(pickler, obj): if not _locate_function(obj, pickler): log.info("F1: %s" % obj) globs = get_function_globals(obj) mod_name = obj.__module__ pickler.save_reduce(_create_function, (get_function_code(obj), {}, obj.__name__, get_function_defaults(obj), get_function_closure(obj), obj.__dict__, mod_name), obj=obj, func_globals=globs) log.info("# F1 %s" % obj) else: log.info("F2: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# F2 %s" % obj) return
def save_classobj(pickler, obj): if obj.__module__ == '__main__': log.info("C1: %s" % obj) pickler.save_reduce(ClassType, (obj.__name__, obj.__bases__, obj.__dict__), obj=obj) log.info("# C1") elif obj.__module__ in sys.modules and _from_ship_path(sys.modules[obj.__module__].__file__, pickler.ship_path): log.info("C3: %s" % obj) class_dict = obj.__dict__ class_funcs = dict([(k, v) for k, v in iteritems(class_dict) \ if isinstance(v, FunctionType) or isinstance(v, classmethod) or isinstance(v, staticmethod)]) class_non_funcs = dict([(k, v) for k, v in iteritems(class_dict) \ if not (isinstance(v, FunctionType) or isinstance(v, classmethod) or isinstance(v, staticmethod))]) pickler.save_reduce(ClassType, (obj.__name__, obj.__bases__, class_non_funcs), obj=obj, class_dict=class_funcs) log.info("# C3") else: log.info("C2: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# C2") return
def save_function(self, obj, name=None): """ Registered with the dispatch to handle all function types. Determines what kind of function obj is (e.g. lambda, defined at interactive prompt, etc) and handles the pickling appropriately. """ if _is_importable_by_name(obj, name=name): return Pickler.save_global(self, obj, name=name) elif PYPY and isinstance(obj.__code__, builtin_code_type): return self.save_pypy_builtin_func(obj) else: return self.save_function_tuple(obj)
def save_builtin_method(pickler, obj): if obj.__self__ is not None: if obj.__self__ is __builtin__: module = 'builtins' if PY3 else '__builtin__' _t = "B1" log.info("%s: %s" % (_t, obj)) else: module = obj.__self__ _t = "B3" log.info("%s: %s" % (_t, obj)) if is_dill(pickler): _recurse = pickler._recurse pickler._recurse = False pickler.save_reduce(_get_attr, (module, obj.__name__), obj=obj) if is_dill(pickler): pickler._recurse = _recurse log.info("# %s" % _t) else: log.info("B2: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# B2") return
def save_global(self, obj, name=None, pack=struct.pack): """ Save a "global". The name of this method is somewhat misleading: all types get dispatched here. """ if obj is type(None): return self.save_reduce(type, (None, ), obj=obj) elif obj is type(Ellipsis): return self.save_reduce(type, (Ellipsis, ), obj=obj) elif obj is type(NotImplemented): return self.save_reduce(type, (NotImplemented, ), obj=obj) elif obj in _BUILTIN_TYPE_NAMES: return self.save_reduce(_builtin_type, (_BUILTIN_TYPE_NAMES[obj], ), obj=obj) elif name is not None: Pickler.save_global(self, obj, name=name) elif not _is_importable_by_name(obj, name=name): self.save_dynamic_class(obj) else: Pickler.save_global(self, obj, name=name)
def save_type(pickler, obj): #stack.add(obj) #XXX: probably don't need object from all cases below if obj in _typemap: log.info("T1: %s" % obj) pickler.save_reduce(_load_type, (_typemap[obj],), obj=obj) log.info("# T1") elif obj.__module__ == '__main__': try: # use StockPickler for special cases [namedtuple,] [getattr(obj, attr) for attr in ('_fields','_asdict', '_make','_replace')] log.info("T6: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# T6") return except AttributeError: pass if issubclass(type(obj), type): # try: # used when pickling the class as code (or the interpreter) if is_dill(pickler) and not pickler._byref: # thanks to Tom Stepleton pointing out pickler._session unneeded _t = 'T2' log.info("%s: %s" % (_t, obj)) _dict = _dict_from_dictproxy(obj.__dict__) # except: # punt to StockPickler (pickle by class reference) else: log.info("T5: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# T5") return else: _t = 'T3' log.info("%s: %s" % (_t, obj)) _dict = obj.__dict__ #print (_dict) #print ("%s\n%s" % (type(obj), obj.__name__)) #print ("%s\n%s" % (obj.__bases__, obj.__dict__)) pickler.save_reduce(_create_type, (type(obj), obj.__name__, obj.__bases__, _dict), obj=obj) log.info("# %s" % _t) else: log.info("T4: %s" % obj) #print (obj.__dict__) #print ("%s\n%s" % (type(obj), obj.__name__)) #print ("%s\n%s" % (obj.__bases__, obj.__dict__)) StockPickler.save_global(pickler, obj) log.info("# T4") return
def save_type(pickler, obj): if obj in _type_map: log.info("T1: %s" % obj) pickler.save_reduce(_load_type, (_type_map[obj],), obj=obj) log.info("# T1") elif obj.__module__ == '__main__': try: # use StockPickler for special cases [namedtuple,] [getattr(obj, attr) for attr in ('_fields', '_asdict', '_make', '_replace')] log.info("T6: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# T6") return except AttributeError: pass if issubclass(type(obj), type): # try: # used when pickling the class as code (or the interpreter) if is_dill(pickler) and not pickler._byref: # thanks to Tom Stepleton pointing out pickler._session unneeded _t = 'T2' log.info("%s: %s" % (_t, obj)) _dict = _dict_from_dictproxy(obj.__dict__) else: log.info("T5: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# T5") return else: _t = 'T3' log.info("%s: %s" % (_t, obj)) _dict = obj.__dict__ pickler.save_reduce(_create_type, (type(obj), obj.__name__, obj.__bases__, _dict), obj=obj) log.info("# %s" % _t) # special cases: NoneType elif isinstance(obj, type(None)): log.info("T7: %s" % obj) pickler.write_lines('c__builtin__\nNoneType\n') log.info("# T7") else: log.info("T4: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# T4") return
def save_type(pickler, obj): if obj in _typemap: log.info("T1: %s" % obj) pickler.save_reduce(_load_type, (_typemap[obj], ), obj=obj) elif obj.__module__ == '__main__': try: # use StockPickler for special cases [namedtuple,] [ getattr(obj, attr) for attr in ('_fields', '_asdict', '_make', '_replace') ] log.info("T6: %s" % obj) StockPickler.save_global(pickler, obj) return except AttributeError: pass if issubclass(type(obj), type): # try: # used when pickling the class as code (or the interpreter) if is_dill(pickler) and not pickler._byref: # thanks to Tom Stepleton pointing out pickler._session unneeded log.info("T2: %s" % obj) _dict = _dict_from_dictproxy(obj.__dict__) # except: # punt to StockPickler (pickle by class reference) else: log.info("T5: %s" % obj) StockPickler.save_global(pickler, obj) return else: log.info("T3: %s" % obj) _dict = obj.__dict__ #print (_dict) #print ("%s\n%s" % (type(obj), obj.__name__)) #print ("%s\n%s" % (obj.__bases__, obj.__dict__)) pickler.save_reduce(_create_type, (type(obj), obj.__name__, obj.__bases__, _dict), obj=obj) else: log.info("T4: %s" % obj) #print (obj.__dict__) #print ("%s\n%s" % (type(obj), obj.__name__)) #print ("%s\n%s" % (obj.__bases__, obj.__dict__)) StockPickler.save_global(pickler, obj) return
def save_type(pickler, obj): if obj in _typemap: log.info("T1: %s" % obj) pickler.save_reduce(_load_type, (_typemap[obj],), obj=obj) elif obj.__module__ == '__main__': try: # use StockPickler for special cases [namedtuple,] [getattr(obj, attr) for attr in ('_fields','_asdict', '_make','_replace')] log.info("T6: %s" % obj) StockPickler.save_global(pickler, obj) return except AttributeError: pass if type(obj) == type: # try: # used when pickling the class as code (or the interpreter) if is_dill(pickler) and not pickler._byref: # thanks to Tom Stepleton pointing out pickler._session unneeded log.info("T2: %s" % obj) _dict = _dict_from_dictproxy(obj.__dict__) # except: # punt to StockPickler (pickle by class reference) else: log.info("T5: %s" % obj) StockPickler.save_global(pickler, obj) return else: log.info("T3: %s" % obj) _dict = obj.__dict__ #print (_dict) #print ("%s\n%s" % (type(obj), obj.__name__)) #print ("%s\n%s" % (obj.__bases__, obj.__dict__)) pickler.save_reduce(_create_type, (type(obj), obj.__name__, obj.__bases__, _dict), obj=obj) else: log.info("T4: %s" % obj) #print (obj.__dict__) #print ("%s\n%s" % (type(obj), obj.__name__)) #print ("%s\n%s" % (obj.__bases__, obj.__dict__)) StockPickler.save_global(pickler, obj) return
def save_numpy_ufunc(pickler, obj): log.info("Nu: %s" % obj) StockPickler.save_global(pickler, obj) log.info("# Nu") return
def save_numpy_ufunc(pickler, obj): log.info("Nu: %s" % obj) StockPickler.save_global(pickler, obj) return