Kaydet (Commit) c202fd20 authored tarafından Guido van Rossum's avatar Guido van Rossum

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

1.71:
Fiddle comments and variable names in whichmodule().
üst d1bb7550
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment