[Python-ideas] while conditional in list comprehension ??

Steven D'Aprano steve at pearwood.info
Wed Jan 30 23:56:14 CET 2013


On 31/01/13 05:05, Oscar Benjamin wrote:
> On 30 January 2013 17:56, Yuriy Taraday<yorik.sar at gmail.com>  wrote:
>>
>> On Wed, Jan 30, 2013 at 1:46 PM, Wolfgang Maier
>> <wolfgang.maier at biologie.uni-freiburg.de>  wrote:
>>>
>>> your condition is 'partial(lt,50)', but this is not met to begin with and
>>> results in an empty list at least for me. Have you two actually checked
>>> the
>>> output of the code or have you just timed it?
>>
>> Yeah. Shame on me. You're right. My belief in partial and operator module
>> has been shaken.
>>
>
> This is why I prefer this stop() idea to any of the takewhile()
> versions: regardless of performance it leads to clearer code, that can
> be understood more easily.


Funny you say that, clarity of code and ease of understanding is exactly why
I dislike this stop() idea.


1) It does not work with list, dict or set comprehensions, only with generator
    expressions. So if you need a list, dict or set, you have to avoid the
    obvious list/dict/set comprehension.


2) It is fragile: it is easy enough to come up with examples of the above
    that *appear* to work:

    [i for i in range(20) if i < 50 or stop()]  # appears to work fine
    [i for i in range(20) if i < 10 or stop()]  # breaks


3) It reads wrong for a Python boolean expression. Given an if clause:

        if cond1() or cond2()

     you should expect that an element is generated if either cond1 or cond2
     are true. When I see "if cond1() or stop()" I don't read it as "stop if
     not cond1()" but as a Python bool expression, "generate an element if
     cond1() gives a truthy value or if stop() gives a truthy value".


This "if cond or stop()" is a neat hack, but it's still a hack, and less
readable and understandable than I expect from Python code.


-- 
Steven



More information about the Python-ideas mailing list