[Python-ideas] Add the method decorator

Ed Kellett e+python-ideas at kellett.im
Thu Apr 12 10:30:12 EDT 2018


On 2018-04-12 14:57, Serhiy Storchaka wrote:
> If noddy_name is a Python function, noddy.name() will call
> noddy_name(noddy), but if it is a C function, noddy.name() will call
> noddy_name().
> 
> The same is true for classes and custom callables.

FWIW, you could (almost) do this in py2:

>>> class Str(str): pass
...
>>> Str.print = types.MethodType(print, None, Str)
>>> Str("hello").print()
hello

> If a function is a descriptor, it can be converted into non-descriptor
> function by wrapping it with the staticmethod decorator. I suggest to
> add the method decorator, which converts an rbitrary callable into a
> descriptor.
> 
>     class Noddy:
>         name = method(noddy_name)
> 
> This will help to implement only performance critical method of a class
> in C.

Does the method decorator need to be written in C for the performance
benefit? If you can stand __get__ being Python, it's pretty easy to
write and doesn't need to change the language.

This does remind me of my favourite silly functional Python trick: as
long as foo is implemented in Python, foo.__get__(x)(y,z) is equivalent
to foo(x,y,z), which is useful if you find Python's standard partial
application syntax too ugly.

> Currently you need to implement a base class in C, and inherit
> Python class from C class. But this doesn't work when the class should
> be inherited from other C class, or when an existing class should be
> patched like in total_ordering.
> 
> This will help also to use custom callables as methods.

I wonder if it wouldn't make more sense to make the behaviour consistent
between Python and C functions... that

someclass.blah = a_python_function

already does a frequently-wrong thing suggests (to me) that maybe the
proper solution would be to bring back unbound method objects.

Ed

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180412/cce10a33/attachment.sig>


More information about the Python-ideas mailing list