On 27 July 2016 at 22:30, Nick Coghlan
On 28 July 2016 at 03:56, Joao S. O. Bueno
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-itse...
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@gmail.com | Brisbane, Australia