if, continuation and indentation

Colin J. Williams cjwilliams43 at gmail.com
Sun May 30 15:10:23 EDT 2010


On 30-May-10 01:50 AM, Nathan Rice wrote:
> I prefer to just break such things into multiple lines.  You're doing
> that already anyhow, it's not much of a speed hit, and it makes exactly
> what you're testing explicit.  If I break a statement onto multiple
> lines I only use parenthesis, and that is as a last resort.  In my
> opinion there's almost always some combination of variable assignments
> and lambda expressions that uses fewer lines and is clearer.
>
> is_correct_style = width == 0 and height == 0 and color == 'red'
> if (is_correct_style and emphasis == 'strong') or highlight > 100:
>
>
> On Sat, May 29, 2010 at 8:59 PM, Mark Lawrence <breamoreboy at yahoo.co.uk
> <mailto:breamoreboy at yahoo.co.uk>> wrote:
>
>     On 30/05/2010 01:23, john wrote:
>
>         On May 28, 10:37 am, "Colin J. Williams"<cjwilliam... at gmail.com
>         <mailto:cjwilliam... at gmail.com>>
>         wrote:
>
>             On 28-May-10 05:54 AM, Jonathan Hartley wrote:
>
>                 On May 27, 1:57 pm, Jean-Michel
>                 Pichavant<jeanmic... at sequans.com
>                 <mailto:jeanmic... at sequans.com>>
>                 wrote:
>
>                     HH wrote:
>
>                         I have a question about best practices when it
>                         comes to line wrapping/
>                         continuation and indentation, specifically in
>                         the case of an if
>                         statement.
>
>
>                         When I write an if statement with many
>                         conditions, I prefer to use a
>                         parenthesis around the whole block and get the
>                         implicit continuation,
>                         rather than ending each line with an escape
>                         character.  Thus, using
>                         the example from the style guide
>                         (http://www.python.org/dev/peps/
>                         pep-0008/) I would write:
>
>
>                               if (width == 0 and
>                                   height == 0 and
>                                   color == 'red' and
>                                   emphasis == 'strong' or
>                                   highlight>    100):
>                                   raise ValueError("sorry, you lose")
>
>
>                         The problem should be obvious -- it's not easy
>                         to see where the
>                         conditional ends and the statement begins since
>                         they have the same
>                         indentation.  Part of the problem, I suppose, is
>                         that Emacs indents
>                         'height' and the other lines in the conditional
>                         to 4 spaces (because
>                         of the parenthesis).  How do people deal with
>                         this situation?
>
>
>                         Thanks,
>                         Henrik
>
>
>                     One possible solution
>
>
>                           if (
>                                   width == 0 and
>                                   height == 0 and
>                                   color == 'red' and
>                                   emphasis == 'strong' or
>                                   highlight>    100
>                              ):
>                               raise ValueError("sorry, you lose")
>
>
>                     JM
>
>
>                 I've always liked this, or even:
>
>
>                     if (
>                         width == 0 and
>                         height == 0 and
>                         color == 'red' and
>                         emphasis == 'strong' or
>                         highlight>    100
>                     ):
>                         raise ValueError("sorry, you lose")
>
>
>                 but my co-workers have uniformly gone bananas whenever I
>                 try it.
>
>
>             I liked:
>
>             On 27-May-10 08:48 AM, Xavier Ho wrote:
>              >  On 27 May 2010 22:22, HH<henri... at gmail.com
>             <mailto:henri... at gmail.com>> <mailto:henri... at gmail.com
>             <mailto:henri... at gmail.com>>>  wrote:
>
>              >
>              >           if (width == 0 and
>              >               height == 0 and
>              >               color == 'red' and
>              >               emphasis == 'strong' or
>              >               highlight>  100):
>              >               raise ValueError("sorry, you lose")
>              >
>              >
>              >  I've gotta say - I've bumped into this problem before,
>             and I'm sure many
>              >  other have - this is a valid question. It just hasn't
>             bothered me enough
>              >  to ask...
>              >
>              >  Correct me if I'm wrong, but I think the following is
>             equivalent, and
>              >  looks better. Although this won't fix all ugly cases in
>             that problem..
>              >
>              >  if (width, height, color, emphasis) == (0, 0, 'red',
>             'strong') or
>              >  highlight>  100:
>              >        raise ValueError("sorry, you lose")
>              >
>              >  Cheers,
>              >  Xav
>
>             but nobody commented.
>
>             Colin W.
>
>
>         Colin:
>         Sure, you can do it that way.  IMO, though, the OP was  wrong,
>         and so
>         is the PEP.  Source code is meant to communicate.  So it must
>         transmit
>         the correct information to the computer; it also must inform your
>         coworkers.  That means that you have a responsibility to care what
>         they think, though you privately have your opinions.  Another reason
>         the PEP is faulty in this circumstance is that a misplaced
>         backslash,
>         or a missing one, is easily found and fixed.  A misplaced
>         parentheses,
>         or just one of a pair, will transform your source code into
>         something
>         which may compile and then give faulty results:  a disaster.
>         So keep it simple, and make it legible.
>         Yours,
>         John
>
>
>     IMHO complete garbage, if your editor doesn't show misplaced or
>     missing parenthesis by highlighting you're using the wrong editor :)
>
>     Regards.
>
>     Mark Lawrence.
>
>
>
>     --
>     http://mail.python.org/mailman/listinfo/python-list
>
>

Perhaps the arrangement below shows the matching a little better than 
the Xav suggestion.  The main point is that, to me, the tuple shows the 
item by item matching better than a series of and clauses:

# tif.py

(width, height, color, emphasis)= 0, 0, 'red', 'strong'
highlight= 99
if (width, height, color, emphasis) ==      \
    (    0,     0,  'red', 'strong') or highlight>  100:
        raise ValueError("sorry, you lose")

Colin W.





More information about the Python-list mailing list