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

Steve Dower steve.dower at python.org
Thu Jan 11 23:45:40 EST 2018

I certainly have code that joins __module__ with __name__ to create a 
fully-qualified name (with special handling for those builtins that are 
not in builtins), and IIUC __qualname__ doesn't normally include the 
module name either (it's intended for nested types/functions).

Can we make it visible when you import the builtins module, but not in 
the builtins namespace?


On 12Jan2018 0941, Victor Stinner wrote:
> I like the idea of having a fully qualified name that "works" (can be
> resolved).
> I don't think that repr() should change, right?
> Can this change break the backward compatibility somehow?
> Victor
> Le 11 janv. 2018 21:00, "Serhiy Storchaka" <storchaka at gmail.com
> <mailto:storchaka at gmail.com>> a écrit :
>     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