pickleutil.py
127 lines
| 3.4 KiB
| text/x-python
|
PythonLexer
MinRK
|
r3539 | # encoding: utf-8 | ||
"""Pickle related utilities. Perhaps this should be called 'can'.""" | ||||
__docformat__ = "restructuredtext en" | ||||
#------------------------------------------------------------------------------- | ||||
# Copyright (C) 2008 The IPython Development Team | ||||
# | ||||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#------------------------------------------------------------------------------- | ||||
#------------------------------------------------------------------------------- | ||||
# Imports | ||||
#------------------------------------------------------------------------------- | ||||
from types import FunctionType | ||||
MinRK
|
r3607 | import copy | ||
MinRK
|
r3539 | |||
MinRK
|
r3546 | from IPython.zmq.parallel.dependency import dependent | ||
MinRK
|
r3607 | |||
MinRK
|
r3557 | import codeutil | ||
MinRK
|
r3539 | |||
MinRK
|
r3607 | #------------------------------------------------------------------------------- | ||
# Classes | ||||
#------------------------------------------------------------------------------- | ||||
MinRK
|
r3539 | class CannedObject(object): | ||
MinRK
|
r3546 | def __init__(self, obj, keys=[]): | ||
self.keys = keys | ||||
MinRK
|
r3607 | self.obj = copy.copy(obj) | ||
MinRK
|
r3546 | for key in keys: | ||
MinRK
|
r3607 | setattr(self.obj, key, can(getattr(obj, key))) | ||
MinRK
|
r3546 | |||
MinRK
|
r3539 | |||
MinRK
|
r3546 | def getObject(self, g=None): | ||
if g is None: | ||||
g = globals() | ||||
for key in self.keys: | ||||
setattr(self.obj, key, uncan(getattr(self.obj, key), g)) | ||||
return self.obj | ||||
MinRK
|
r3539 | class CannedFunction(CannedObject): | ||
def __init__(self, f): | ||||
self._checkType(f) | ||||
self.code = f.func_code | ||||
MinRK
|
r3607 | self.__name__ = f.__name__ | ||
MinRK
|
r3539 | |||
def _checkType(self, obj): | ||||
assert isinstance(obj, FunctionType), "Not a function type" | ||||
def getFunction(self, g=None): | ||||
if g is None: | ||||
g = globals() | ||||
newFunc = FunctionType(self.code, g) | ||||
return newFunc | ||||
MinRK
|
r3607 | #------------------------------------------------------------------------------- | ||
# Functions | ||||
#------------------------------------------------------------------------------- | ||||
MinRK
|
r3539 | def can(obj): | ||
if isinstance(obj, FunctionType): | ||||
return CannedFunction(obj) | ||||
MinRK
|
r3546 | elif isinstance(obj, dependent): | ||
keys = ('f','df') | ||||
return CannedObject(obj, keys=keys) | ||||
MinRK
|
r3539 | elif isinstance(obj,dict): | ||
return canDict(obj) | ||||
elif isinstance(obj, (list,tuple)): | ||||
return canSequence(obj) | ||||
else: | ||||
return obj | ||||
def canDict(obj): | ||||
if isinstance(obj, dict): | ||||
newobj = {} | ||||
for k, v in obj.iteritems(): | ||||
newobj[k] = can(v) | ||||
return newobj | ||||
else: | ||||
return obj | ||||
def canSequence(obj): | ||||
if isinstance(obj, (list, tuple)): | ||||
t = type(obj) | ||||
return t([can(i) for i in obj]) | ||||
else: | ||||
return obj | ||||
def uncan(obj, g=None): | ||||
if isinstance(obj, CannedFunction): | ||||
return obj.getFunction(g) | ||||
MinRK
|
r3546 | elif isinstance(obj, CannedObject): | ||
return obj.getObject(g) | ||||
MinRK
|
r3539 | elif isinstance(obj,dict): | ||
return uncanDict(obj) | ||||
elif isinstance(obj, (list,tuple)): | ||||
return uncanSequence(obj) | ||||
else: | ||||
return obj | ||||
def uncanDict(obj, g=None): | ||||
if isinstance(obj, dict): | ||||
newobj = {} | ||||
for k, v in obj.iteritems(): | ||||
newobj[k] = uncan(v,g) | ||||
return newobj | ||||
else: | ||||
return obj | ||||
def uncanSequence(obj, g=None): | ||||
if isinstance(obj, (list, tuple)): | ||||
t = type(obj) | ||||
return t([uncan(i,g) for i in obj]) | ||||
else: | ||||
return obj | ||||
def rebindFunctionGlobals(f, glbls): | ||||
return FunctionType(f.func_code, glbls) | ||||