[Python-Dev] Re: Guido's Magic Code was: inline sort option

Alex Martelli aleaxit at yahoo.com
Thu Oct 30 03:59:33 EST 2003

On Thursday 30 October 2003 06:49 am, Raymond Hettinger wrote:
> Universal methods give the method a way to handle the two
> cases separately.  This provides both the capability to make
> an instance from scratch or to copy it off an existing instance.
> Your example was especially compelling:
>     a = [3,2,1]
>     print a.sorted()
>     print list.sorted(a)

Actually, yes, it IS compelling indeed.  Funny -- I was originally just
brainstorming / musing out loud, never thought about this as a "real
thing".  But now that it's matured a bit, I do feel sure -- from past
experience with what puzzles Python newbies depending on their
previous programming knowledge or lack thereof -- that if we had
this it would *seriously* reduce the number of puzzlements we have
to solve on c.l.py or help at python.org.  Which IS strange, in a way,
because I do not know of any existing language that has exactly
this kind of construct -- a factory callable that you can call on either
a type or an instance with good effect.  Yet despite it not being
previously familiar it DOES "feel natural".

Of course, the 3 lines above would also work if sorted was an
ordinary instancemethod, but that's just because a is a list instance;
if we had some other sequence, say a generator expression,
    print list.sorted(x*x for x in a)
would be just as sweet, and _that_ is the compelling detail IMHO.

Trying to think of precedents: Numeric and gmpy have quite a
few things like that, except they're (by necessity of the age of gmpy
and Numeric) ordinary module functions AND instance methods.

>>> gmpy.sqrt(33)
>>> gmpy.mpz(33).sqrt()
>>> gmpy.fsqrt(33)
>>> gmpy.mpf(33).sqrt()

as a module function, sqrt is the truncating integer square root,
which is also a method of mpz instances (mpz being the integer
type in gmpy).  mpf (the float type in gmpy) has a sqrt method
too, which is nontruncating -- that is also a module function, but,
as such, it needs to be called fsqrt (sigh).  I sure _would_ like to
expose the functionality as mpf.sqrt(x) and mpz.sqrt(x) [would
of course be more readable with other typenames than those
'mpf' and 'mpz', but that's another issue, strictly a design mistake
of mine].


More information about the Python-Dev mailing list