# -*- coding: utf-8 -*- """ Class which mimics a module. Needed to allow pickle to correctly resolve namespaces during IPython sessions. """ #***************************************************************************** # Copyright (C) 2002-2004 Fernando Perez. # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #***************************************************************************** import types def init_fakemod_dict(fm,adict=None): """Initialize a FakeModule instance __dict__. Kept as a standalone function and not a method so the FakeModule API can remain basically empty. This should be considered for private IPython use, used in managing namespaces for %run. Parameters ---------- fm : FakeModule instance adict : dict, optional """ dct = {} # It seems pydoc (and perhaps others) needs any module instance to # implement a __nonzero__ method, so we add it if missing: dct.setdefault('__nonzero__',lambda : True) dct.setdefault('__file__',__file__) if adict is not None: dct.update(adict) # Hard assignment of the object's __dict__. This is nasty but deliberate. fm.__dict__.clear() fm.__dict__.update(dct) class FakeModule(types.ModuleType): """Simple class with attribute access to fake a module. This is not meant to replace a module, but to allow inserting a fake module in sys.modules so that systems which rely on run-time module importing (like shelve and pickle) work correctly in interactive IPython sessions. Do NOT use this code for anything other than this IPython private hack.""" def __init__(self,adict=None): # tmp to force __dict__ instance creation, else self.__dict__ fails self.__iptmp = None # cleanup our temp trick del self.__iptmp # Now, initialize the actual data in the instance dict. init_fakemod_dict(self,adict)