mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Provide __module__ attributes for functions defined in C and Python.
__module__ is the string name of the module the function was defined in, just like __module__ of classes. In some cases, particularly for C functions, the __module__ may be None. Change PyCFunction_New() from a function to a macro, but keep an unused copy of the function around so that we don't change the binary API. Change pickle's save_global() to use whichmodule() if __module__ is None, but add the __module__ logic to whichmodule() since it might be used outside of pickle.
This commit is contained in:
parent
8f24cdc0d5
commit
4f0dcc9a9a
8 changed files with 114 additions and 18 deletions
|
@ -787,9 +787,8 @@ class Pickler:
|
|||
if name is None:
|
||||
name = obj.__name__
|
||||
|
||||
try:
|
||||
module = obj.__module__
|
||||
except AttributeError:
|
||||
module = getattr(obj, "__module__", None)
|
||||
if module is None:
|
||||
module = whichmodule(obj, name)
|
||||
|
||||
try:
|
||||
|
@ -876,6 +875,10 @@ def whichmodule(func, funcname):
|
|||
Return a module name.
|
||||
If the function cannot be found, return "__main__".
|
||||
"""
|
||||
# Python functions should always get an __module__ from their globals.
|
||||
mod = getattr(func, "__module__", None)
|
||||
if mod is not None:
|
||||
return mod
|
||||
if func in classmap:
|
||||
return classmap[func]
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue