[Python-ideas] Another indentation style
Rob Cliffe
rob.cliffe at btinternet.com
Sun Sep 1 13:10:19 CEST 2013
On 01/09/2013 10:21, Steven D'Aprano wrote:
> On 01/09/13 18:31, Musical Notation wrote:
>> In Haskell, you can write:
>>
>> let x=1
>> y=2
>>
>> In Python, why you can't write:
>>
>> if True: x=x+1
>> y=x
>>
>> ?
>
> Because allowing that does not let you do anything different or new
> that you couldn't do before, it would not make code any clearer or
> more understandable, and it would decrease the readability of the code.
>
If I can be forgiven for slightly changing the subject (sorry, Musical
Notation):
Talking of unconventional ways of indenting:
In Python, writing multiple code statements on a single line, especially
with a semi-colin, appears to be a taboo roughly on a par with appearing
naked in public. But I believe that there are times when it is the
clearest way of writing code, viz. when it makes visually obvious a
*pattern* in the code.
Here is one example, not very different from some "real" code that I wrote:
def test(condition, a, b):
if condition=='equals' : return a==b
if condition=='is greater than' : return a>b
if condition=='contains' : return b in a
if condition=='starts with' : return a.startswith(b)
etc.
And here is some real code that I wrote (not worth explaining in
detail). I am sorry that it breaks another convention, having lines
longer than 80 characters - this happens not be inconvenient for me, and
was the best authentic *real* example I could find without spending a
long time searching:
assert PN[0].isalpha() ; FirstPart = PN[0] ; PN =
PN[1:].lstrip(Seps) # Must be a letter
if PN[0].isalpha() : FirstPart += PN[0] ; PN =
PN[1:].lstrip(Seps) # May be a second letter
assert PN[0].isdigit() ; FirstPart += PN[0] ; PN =
PN[1:].lstrip(Seps) # Must be a digit
if PN and PN[0].isalnum() : FirstPart += PN[0] ; PN =
PN[1:] # May be a letter or digit
(These examples look best with the colons/semicolons/equals
signs/statements lined up vertically. They will probably look ragged in
an e-mail. They should look as intended if they are cut and pasted into
a (fixed-size font) editor.)
Writing the code like this makes apparent:
(1) There is a pattern to the code.
(2) Where the pattern is not quite consistent. E.g. in my second
example the first line contains "FirstPart =", the other lines contain
"FirstPart +=". *Seeing* this is half-way to understanding it.
(3) The conceptual separation of the whole chunk of code from what
precedes and what follows it (which can be emphasised by putting a blank
line before and after it).
*None* of this would be so apparent if the code were written one
statement per line. (Is 'statement' the correct technical term? Please
correct me.) There is also a minor advantage to writing fewer lines of
code - you can see more of the program in one screenfull at a time.
(And: that you may find a smarter way of rewriting these specific
examples is not really the point. In my younger days I might have written:
if wkday==0: return 'Monday'
if wkday==1: return 'Tuesday'
etc.
Nowadays I would probably write something like
return { 0 : 'Monday', 1 : 'Tuesday' ... etc. }[wkday]
And you may have an even better way.
Again - not really the point.
)
Best wishes,
Rob Cliffe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20130901/2301f7d3/attachment.html>
More information about the Python-ideas
mailing list