|
|
# encoding: utf-8
|
|
|
|
|
|
"""Pickle related utilities."""
|
|
|
|
|
|
__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
|
|
|
from twisted.python import log
|
|
|
|
|
|
class CannedObject(object):
|
|
|
pass
|
|
|
|
|
|
class CannedFunction(CannedObject):
|
|
|
|
|
|
def __init__(self, f):
|
|
|
self._checkType(f)
|
|
|
self.code = f.func_code
|
|
|
|
|
|
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
|
|
|
|
|
|
def can(obj):
|
|
|
if isinstance(obj, FunctionType):
|
|
|
return CannedFunction(obj)
|
|
|
else:
|
|
|
return obj
|
|
|
|
|
|
def canDict(obj):
|
|
|
if isinstance(obj, dict):
|
|
|
for k, v in obj.iteritems():
|
|
|
obj[k] = can(v)
|
|
|
return obj
|
|
|
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)
|
|
|
else:
|
|
|
return obj
|
|
|
|
|
|
def uncanDict(obj, g=None):
|
|
|
if isinstance(obj, dict):
|
|
|
for k, v in obj.iteritems():
|
|
|
obj[k] = uncan(v,g)
|
|
|
return obj
|
|
|
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)
|
|
|
|