[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__
'builtins'
>>> type(f).__name__
'function'
>>> type(f).__qualname__
'function'
>>> 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