##// END OF EJS Templates
testing fixes
testing fixes

File last commit:

r3638:11c0dbe7
r3641:4f574e16
Show More
pickleutil.py
127 lines | 3.4 KiB | text/x-python | PythonLexer
MinRK
prep newparallel for rebase...
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
Improvements to dependency handling...
r3607 import copy
MinRK
prep newparallel for rebase...
r3539
MinRK
added dependency decorator
r3546 from IPython.zmq.parallel.dependency import dependent
MinRK
Improvements to dependency handling...
r3607
MinRK
codeutil into zmq, to prevent IPython.kernel import
r3557 import codeutil
MinRK
prep newparallel for rebase...
r3539
MinRK
Improvements to dependency handling...
r3607 #-------------------------------------------------------------------------------
# Classes
#-------------------------------------------------------------------------------
MinRK
prep newparallel for rebase...
r3539 class CannedObject(object):
MinRK
added dependency decorator
r3546 def __init__(self, obj, keys=[]):
self.keys = keys
MinRK
Improvements to dependency handling...
r3607 self.obj = copy.copy(obj)
MinRK
added dependency decorator
r3546 for key in keys:
MinRK
Improvements to dependency handling...
r3607 setattr(self.obj, key, can(getattr(obj, key)))
MinRK
added dependency decorator
r3546
MinRK
prep newparallel for rebase...
r3539
MinRK
added dependency decorator
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
prep newparallel for rebase...
r3539 class CannedFunction(CannedObject):
def __init__(self, f):
self._checkType(f)
self.code = f.func_code
MinRK
Improvements to dependency handling...
r3607 self.__name__ = f.__name__
MinRK
prep newparallel for rebase...
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
Improvements to dependency handling...
r3607 #-------------------------------------------------------------------------------
# Functions
#-------------------------------------------------------------------------------
MinRK
prep newparallel for rebase...
r3539 def can(obj):
if isinstance(obj, FunctionType):
return CannedFunction(obj)
MinRK
added dependency decorator
r3546 elif isinstance(obj, dependent):
keys = ('f','df')
return CannedObject(obj, keys=keys)
MinRK
prep newparallel for rebase...
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
added dependency decorator
r3546 elif isinstance(obj, CannedObject):
return obj.getObject(g)
MinRK
prep newparallel for rebase...
r3539 elif isinstance(obj,dict):
MinRK
fix/test pushed function globals
r3638 return uncanDict(obj, g)
MinRK
prep newparallel for rebase...
r3539 elif isinstance(obj, (list,tuple)):
MinRK
fix/test pushed function globals
r3638 return uncanSequence(obj, g)
MinRK
prep newparallel for rebase...
r3539 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)