Guido van Rossum  committed 0e6f0a2

Backport 1.70 and 1.71 (which really go together):

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 <built-in method __new__ of type object at 0x812a440>: it's not the same object as datetime.math.__new__

Fiddle comments and variable names in whichmodule().

  • Participants
  • Parent commits 29d40ea
  • Branches 2.2

Comments (0)

Files changed (1)

File Lib/

-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:
         name = '__main__'
-    classmap[cls] = name
+    classmap[func] = name
     return name