Anonymus functions revisited

bruno modulix onurb at xiludom.gro
Tue Mar 22 05:12:35 EST 2005


Claudio Grondi wrote:
> For me, one of the reasons for using Python
> is the ease and the intuivity of reading its
> code.

I guess this is true for many of us. Now 'ease and intuitivity' stronly 
depends on one's background...

> I have  a problem with intuitively getting
> what is going on when using a pattern like
>   (x,y,z=0) -> (x,y,z)
> where I expect at the first glance some
> C code with access to class members.

<pedantic>
There are nothing like a class or a class member in C.
</pedantic>

> At least I must start looking at the code
> more closely thinking why is someone
> using such a construct.

> Already
>   lambda x,y,z=0:(x,y,z)
> is a problem for me.

Not for me. It's clearly a function that takes 2 mandatory and one 
optional argument (which default to 0), and returns a tuple of it's 
argument.

it's named equivalent is:
def make_three_tuple(x, y, z=0):
   return (x, y, z)

> Why not:
> try:
>   (x,y,z)
> except NameError:
>   z=0
>   (x,y,z)
> ?

Because it does not do the same thing ?-)

Because, if it did, it would still require 5 times more lines of code to 
do the same thing (hence it's more error-prone by a factor a 5) ?

Because it uses an exception, which is far less efficient than using a 
default argument ?

Because the name error could be on x and/or y too, and the try:except 
clause would hide it ?

I stop here, but I think I could think of more good (IMHO) reason to 
prefer the lambda form.

> Watching the last piece of code
> can even directly be seen, that there
> is eventually a NameError
> problem with z to handle,

No. AFAICT, the name error could be with x and/or y and/or z.

> so where is the gain of using
> lambda or the mapping?

See upper...

-- 
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for 
p in 'onurb at xiludom.gro'.split('@')])"



More information about the Python-list mailing list