[Python-Dev] Make __class_getitem__ a class method
Yury Selivanov
yselivanov.ml at gmail.com
Fri Dec 15 13:02:53 EST 2017
On Fri, Dec 15, 2017 at 12:45 PM, Serhiy Storchaka <storchaka at gmail.com> wrote:
> 15.12.17 18:47, Yury Selivanov пише:
>>
>> Shouldn't we optimize the usability for pure-Python first, and then for C
>> API?
>>
>> Right now we have the '__new__' magic method, which isn't a
>> @classmethod. Making '__class_getitem__' a @classmethod will confuse
>> regular Python users. For example:
>>
>> class Foo:
>> def __new__(cls, ...): pass
>>
>> @classmethod
>> def __class_getitem__(cls, item): pass
>>
>> To me it makes sense that type methods that are supposed to be called
>> on type by the Python interpreter don't need the classmethod
>> decorator.
>>
>> METH_STATIC is a public working API, and in my opinion it's totally
>> fine if we use it. It's not even hard to use it, it's just *mildly*
>> inconvenient at most.
>
>
> __new__ is not a class method, it is an "automatic" static method.
I never said that __new__ is a class method :)
> The following two declarations are equivalent:
>
> class A:
> def __new__(cls): return cls.__name__
>
> class B:
> @staticmethod
> def __new__(cls): return cls.__name__
But nobody decorates __new__ with a @staticmethod. And making
__class_getitem__ a @classmethod will only confuse users -- that's all
I'm saying.
So I'm +1 to keep the things exactly as they are now. It would be
great do document that in order to implement __class_getitem__ in C
one should add it as METH_STATIC. I also think we should merge your
PR that tests that it works the way it's expected.
Yury
More information about the Python-Dev
mailing list