[Python-ideas] (no subject)

Rustom Mody rustompmody at gmail.com
Fri May 8 07:19:50 CEST 2015


On Wed, May 6, 2015 at 6:45 PM, Ivan Levkivskyi <levkivskyi at gmail.com>
wrote:

> Dear all,
>
> The matrix multiplication operator @ is going to be introduced in Python
> 3.5 and I am thinking about the following idea:
>
> The semantics of matrix multiplication is the composition of the
> corresponding linear transformations.
> A linear transformation is a particular example of a more general concept
> - functions.
> The latter are frequently composed with ("wrap") each other. For example:
>
> plot(real(sqrt(data)))
>
> However, it is not very readable in case of many wrapping layers.
> Therefore, it could be useful to employ
> the matrix multiplication operator @ for indication of function
> composition. This could be done by such (simplified) decorator:
>
> class composable:
>
>     def __init__(self, func):
>         self.func = func
>
>     def __call__(self, arg):
>         return self.func(arg)
>
>     def __matmul__(self, other):
>         def composition(*args, **kwargs):
>             return self.func(other(*args, **kwargs))
>         return composable(composition)
>
> I think using such decorator with functions that are going to be deeply
> wrapped
> could improve readability.
> You could compare (note that only the outermost function should be
> decorated):
>
> plot(sorted(sqrt(real(data_array)))) vs. (plot @ sorted @ sqrt @ real)
> (data_array)
>
> I think the latter is more readable, also compare
>
> def sunique(lst):
>     return sorted(list(set(lst)))
>
> vs.
>
> sunique = sorted @ list @ set
>

I would like to suggest that if composition is in fact added to python its
order is 'corrected'
ie in math there are two alternative definitions of composition

[1] f o g = λ x • g(f(x))
[2] f o g = λ x • f(g(x))

[2] is more common but [1] is also used

And IMHO [1] is much better for left-to-right reading so your example
becomes
sunique = set @ list @ sorted
which reads as smoothly as a classic Unix pipeline:

"Unnamed parameter input to set; output inputted to list; output inputted
to sort"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20150508/81e445f3/attachment.html>


More information about the Python-ideas mailing list