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 _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor