Lambda going out of fashion

Andrew Dalke dalke at
Sat Dec 25 13:25:25 CET 2004

Terry Reedy wrote:
> Ok, add 'assuming that func and args are a valid callable and sequence 
> respectively.'  Error messages are not part of the specs, and may change 
> for the same code from version to version.

While true, the difference in error messages suggests that the
two approaches use slightly different and possibly exploitable

> To be equivalent to len(*blah), this should be apply(len, blah), no *.

Oops.  Here's one that really works.  I have an idea of why
there's a difference but would rather someone explain it to me.

import traceback

def YieldTest():
    yield "Test"

class Blah:
    __len__ = None
    __iter__ = YieldTest().__iter__
func = len
args = Blah()

    print "apply", apply(func, args)
except TypeError, err:
    print "does not work:", err
    print "call", func(*args)
except TypeError, err:
    print "does not work:", err

The output from running it under Python 2.3 is

apply 4
call does not work: len() takes exactly one argument (0 given)

If I make Blah be a new-style class (ie "class Blah(object):")
I get the opposite success behavior:

apply does not work: apply() arg 2 expected sequence, found Blah
call 4

				dalke at

More information about the Python-list mailing list