Uniform Function Call Syntax (UFCS)
Paul Sokolovsky
pmiscml at gmail.com
Sun Jun 8 12:40:09 EDT 2014
Hello,
On Sun, 08 Jun 2014 18:56:47 +0300
Marko Rauhamaa <marko at pacujo.net> wrote:
> Paul Sokolovsky <pmiscml at gmail.com>:
>
> > Python already has that - like, len(x) calls x.__len__() if it's
> > defined
>
> In fact, what's the point of having the duality?
>
> len(x) <==> x.__len__()
>
> x < y <==> x.__lt__(y)
>
> str(x) <==> x.__str__()
>
> etc.
>
> I suppose the principal reason is that people don't like UFCS. Plus
> some legacy from Python1 days.
I personally don't see it as "duality". There're few generic operators -
the fact that they are really generic (apply to wide different classes
of objects) is exactly the reason why the're defined in global
namespace, and not methods. And yep, I see things like "len" as
essentially an operator, even though its name consists of letters, and
it has function call syntax.
Then, there's just a way to overload these operators for user types,
that's it. You *can* use x.__len__() but that's not how Python intends
it.
And like with any idea, one should not forget implementation side and
efficiency - these operators are really core and expected to be used in
performance-tight contexts, so they are implemented specially
(optimized). Extending that handling to any function would cost either
high memory usage, or high runtime cost.
> Lisp & co. rigorously follow its UFCS. I think it works great, but
> that is what people most ridicule Lisp for.
Exactly my thinking - there're bunch of languages which follow that
UFCS-like idea, likely most homoiconic (or -like) do. Or you can use
plain old C ;-). So, I don't see why people want to stuff this into
Python - there're lot of ready alternatives. And Python provides very
intuitive and obvious separation between generic functions and object
methods IMHO, so there's nothing to "fix".
>
> What do you think? Would you rather write/read:
>
> if size + len(data) >= limit:
"How else could it be?"
>
> or UFCS-ly:
>
> if size.__add__(data.__len__()).__le__(limit):
"OMG!"
> Marko
> --
> https://mail.python.org/mailman/listinfo/python-list
--
Best regards,
Paul mailto:pmiscml at gmail.com
More information about the Python-list
mailing list