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

Alex Martelli aleaxit at yahoo.com
Thu Oct 30 04:24:09 EST 2003


On Thursday 30 October 2003 06:31 am, Guido van Rossum wrote:
> > Notwithstanding the "perverted" implementation, Alex's idea is
> > absolutely wonderful and addresses a core usability issue with
> > classmethods.
>> I'm not so sure. I think the main issue is that Python users aren't
> used to static methods; C++ and Java users should be familiar with
> them and I don't think they cause much trouble there.

"Yes, but". The ability to call something on either the class OR the
instance IS a Python hallmark... with the constraint that when you
call it on the class you need to provide an instance as the first arg
(assuming the "something" is a normal instance method, which is
surely the most frequent case). You could see universalmethods
as being special only in that they WEAKEN this constraint -- they
let the 1st arg be EITHER an instance OR something from which
a new instance can be naturally constructed.
Use cases:
in gmpy:
 if I had universal methods, current instancemethods
 mpf.sqrt
 and
 mpz.sqrt
 (multiprecision floatingpoint and integer/truncating square roots
 respectively) could also be called quite naturally as
 mpf.sqrt(33) and mpz.sqrt(33) respectively. Right now you
 have to use, instead, mpf(33).sqrt() or mpz(33).sqrt(), which
 is QUITE a bit more costly because the instance whose sqrt
 you're taking gets built then immediately discarded (and building
 mpf -- and to a lesser extent mpz -- instances is a bit costly); OR
 you can call module functions gmpy.sqrt(33), truncating sqrt, or
 gmpy.fsqrt(33), nontruncating (returning a multiprecision float).
 Just one example -- gmpy's chock full of things like this, which
 universalmethod would let me organize a bit better.
in Numeric:
 lots of module-functions take an arbitrary iterable, build an array
 instance from it if needed, and operate on an array instance to
 return a result. This sort-of-works basically because Numeric has
 "one main type" and thus the issue of "which type are we talking
 about" doesn't arise (gmpy has 3 types, although mpz takes the
 lion's share, making things much iffier). But still, Numeric newbies
 (if they come from OO languages rather than Fortran) DO try
 calling e.g. x.transpose() for some array x rather than the correct
 Numeric.transpose(x) -- and in fact array.transpose, called on the
 class, would ALSO be a perfeclty natural approach.
 universalmethod would allow array instances to expose such useful
 functionality as instance methods AND also allow applying direct
 operations -- without costly construction of intermediate instances
 to be thrown away at once -- via "array.transpose" and the like.
It's not really about new revolutionary functionality: it's just a neater
way to "site" existing functionality. This isn't surprising if you look at
universalmethod as just a relaxation of the normal constraint "when
you call someclass.somemethod(x, ... -- x must be an instance of
someclass" into "x must be an instance of someclass OR -- if the
somemethod supports it -- something from which such an instance
could be constructed in one obvious way". Then, basically, the call
is semantically equivalent to someclass(x).somemethod(... BUT the
implementation has a chance to AVOID costly construction of an
instance for the sole purpose of calling somemethod on it and then
throwing away the intermediate instance at once.
No revolution, but, I think, a nice little addition to our armoury.
Alex


More information about the Python-Dev mailing list

AltStyle によって変換されたページ (->オリジナル) /