[Python-Dev] Deprecating "instance method" class

Serhiy Storchaka storchaka at gmail.com
Fri Apr 5 13:53:10 EDT 2019


05.04.19 15:33, Jeroen Demeyer пише:
> On 2019-04-05 15:13, Serhiy Storchaka wrote:
>> It is easy to implement a function in C.
> 
> Why does it need to be a PyCFunction? You could put an actual method 
> descriptor in the class. In other words, use PyDescr_NewMethod() instead 
> of PyCFunction_New() + PyInstanceMethod_New(). It's probably going to be 
> faster too since the instancemethod adds an unoptimized extra level of 
> indirection.

PyDescr_NewMethod() takes PyTypeObject* which is not known at that 
moment. But maybe passing &PyBaseObject_Type will make a trick. I need 
to try.

>> Yes, this is what I want to do. I did not do this only because
>> implementing method-like functions which which do not belong to concrete
>> class implemented in C is not convention.
> 
> Sure, you could implement separate methods like __gt__ in C, but that's 
> still less efficient than just implementing a specific tp_richcompare 
> for total_ordering and then having the usual wrapper descriptors for 
> __gt__.

At Python level we can monkeypatch __gt__, but not tp_richcompare.

In any case, removing a C API is a large breakage, and it is better to 
avoid it unless that API is inherently broken.



More information about the Python-Dev mailing list