[Tutor] A Python idiom that I don't get
Kent Johnson
kent37 at tds.net
Wed Apr 26 04:43:25 CEST 2006
Don Taylor wrote:
> I am trying to get some existing CPython 2.4 code working under Jython
> (2.1) and I am puzzled by a line in the following function. It seems to
> be a Python 2.4 idiom that is opaque to me.
>
> The line is:
> prefix = os.path.commonprefix(filter( bool, lines ))
>
> and I don't understand what that 'bool' is doing. Or rather, I think
> that I see what it is doing, but I am not sure - and I don't much like it.
>
> filter is the built-in filter and it requires a callable returning a
> bool as the first argument. It seems that 'bool' without arguments is a
> callable that always evaluates to True (or at least non-zero) so this
> 'bool' always returns True. Is this really true (sic) by intention or
> is it just an implemenation artifact?
No, bool() doesn't always return true, it returns true for arguments
that would evaluate to true in a boolean context, and false otherwise.
In [2]: bool(0)
Out[2]: False
In [3]: bool(1)
Out[3]: True
In [4]: bool([])
Out[4]: False
In [5]: bool(42)
Out[5]: True
>
> I tried replacing 'bool' with 'True' but that won't work because True is
> not callable.
>
> I replaced 'bool' with 'lambda True: True' as in:
> prefix = os.path.commonprefix(filter( lambda True: True, lines ))
> and that does seem to work - and pass its unit tests.
This works but it isn't doing what you think it is.
lambda True: True
is the same as
lambda x: x
i.e. it is just an identity function.
>
> Have I got this right and can I replace 'bool' with the lambda expression?
>
> Or is there a clearer way to do this?
Try filter(None, lines) or use a list comprehension:
[ line for line in lines if line ]
Kent
More information about the Tutor
mailing list