[Python-Dev] PEP487: Simpler customization of class creation

Joao S. O. Bueno jsbueno at python.org.br
Wed Jul 27 23:55:37 EDT 2016

On 27 July 2016 at 22:30, Nick Coghlan <ncoghlan at gmail.com> wrote:
> On 28 July 2016 at 03:56, Joao S. O. Bueno <jsbueno at python.org.br> wrote:
>> Otherwise, I'd suggest at least some PEP rewording to make explicit
>> the fact it is not run on the class it is defined at all.  (I can help
>> with that, but I'd rather see it implemented as above).
> This is covered in the PEP:
> https://www.python.org/dev/peps/pep-0487/#calling-the-hook-on-the-class-itself
>> 2)
>> I have another higher level concern with the PEP as well:
>> It will pass all class keyword parameters, but for "metaclass" to
>> "__init_subclass__" - thus making it all but impossible to any other
>> keyword to the class creation machinery to ever be defined again. We
>> can't think of any such other keyword now, but what might come in a
>> couple of years?
> This isn't a new problem, as it already exists today for custom
> metaclasses. It just means introducing new class construction keywords
> at the language level is something that needs to be handled
> judiciously, and with a view to the fact that it might have knock-on
> effects for other APIs which need to find a new parameter name.

Actually, as documented on the PEP (and I just confirmed at a Python
3.5 prompt),
you actually can't use custom keywords for class defintions. This PEP
fixes that, but at the same time makes any other class reserved
keyword impossible in the future - that is, unless a single line
warning against reserved name patterns is added. I think it is low a
cost not to be paid now, blocking too many - yet to be imagined -
future possibilities.

(as for the example in Py 3.5):

In [17]: def M(type):
   ...:     def __new__(metacls, name, bases, dict, **kw):
   ...:         print(kw)
   ...:         return super().__new__(name, bases, dict)
   ...:     def __init__(cls, name, bases, dict, **kw):
   ...:         print("init...", kw)
   ...:         return super().__init__(name, bases, dict)

In [18]: class A(metaclass=M, test=23, color="blue"):
   ...:     pass
TypeError                                 Traceback (most recent call last)
<ipython-input-18-86d111b5b69c> in <module>()
----> 1 class A(metaclass=M, test=23, color="blue"):
     2     pass

TypeError: M() got an unexpected keyword argument 'color'

> Regards,
> Nick.
> --
> Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia

More information about the Python-Dev mailing list