From: Guido van Rossum Date: Mon, 7 Oct 2002 13:09:25 +0000 (+0000) Subject: Backport 1.70 and 1.71 (which really go together): X-Git-Tag: v2.2.2b1~14 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c202fd20e4ca209d6d1e59c6a7b1855a1b4a6780;p=thirdparty%2FPython%2Fcpython.git Backport 1.70 and 1.71 (which really go together): 1.70: whichmodule() should skip dummy package entries in sys.modules. This fixes the charming, but unhelpful error message for >>> pickle.dumps(type.__new__) Can't pickle : it's not the same object as datetime.math.__new__ 1.71: Fiddle comments and variable names in whichmodule(). --- diff --git a/Lib/pickle.py b/Lib/pickle.py index 38bda79fc566..7f2638541292 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -552,28 +552,29 @@ def _keep_alive(x, memo): memo[id(memo)]=[x] -classmap = {} +classmap = {} # called classmap for backwards compatibility -# This is no longer used to find classes, but still for functions -def whichmodule(cls, clsname): - """Figure out the module in which a class occurs. +def whichmodule(func, funcname): + """Figure out the module in which a function occurs. Search sys.modules for the module. Cache in classmap. Return a module name. - If the class cannot be found, return __main__. + If the function cannot be found, return __main__. """ - if classmap.has_key(cls): - return classmap[cls] + if classmap.has_key(classmap): + return classmap[func] for name, module in sys.modules.items(): + if module is None: + continue # skip dummy package entries if name != '__main__' and \ - hasattr(module, clsname) and \ - getattr(module, clsname) is cls: + hasattr(module, funcname) and \ + getattr(module, funcname) is func: break else: name = '__main__' - classmap[cls] = name + classmap[func] = name return name