From c202fd20e4ca209d6d1e59c6a7b1855a1b4a6780 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 7 Oct 2002 13:09:25 +0000 Subject: [PATCH] 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(). --- Lib/pickle.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) 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 -- 2.47.3