[Python-ideas] Make functions, methods and descriptor types living in the types module

Serhiy Storchaka storchaka at gmail.com
Thu Jan 11 14:56:50 EST 2018

Currently the classes of functions (implemented in Python and builtin), 
methods, and different type of descriptors, generators, etc have the 
__module__ attribute equal to "builtins"  and the name that can't be 
used for accessing the class.

 >>> def f(): pass
 >>> type(f)
<class 'function'>
 >>> type(f).__module__
 >>> type(f).__name__
 >>> type(f).__qualname__
 >>> import builtins
 >>> builtins.function
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: module 'builtins' has no attribute 'function'

But most of this classes (if not all) are exposed in the types module.

I suggest to rename them. Make the __module__ attribute equal to 
"builtins" and the __name__ and the __qualname__ attributes equal to the 
name used for accessing the class in the types module.

This would allow to pickle references to these types. Currently this 
isn't possible.

 >>> pickle.dumps(types.FunctionType)
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
_pickle.PicklingError: Can't pickle <class 'function'>: attribute lookup 
function on builtins failed

And this will help to implement the pickle support of dynamic functions 
etc. Currently the third-party library that implements this needs to use 
a special purposed factory function (not compatible with other similar 
libraries) since types.FunctionType isn't pickleable.

More information about the Python-ideas mailing list