pickleutil.py
83 lines
| 2.0 KiB
| text/x-python
|
PythonLexer
Brian E Granger
|
r1234 | # 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) | ||||