On 24/07/2016 11:45, BartC wrote:
On 24/07/2016 11:35, BartC wrote:
'end' to terminate a block can be emulated of course:
end=0
def fn(a):
if a<=1:
return 1
else:
return fn(a-1)
end
end
Actually this is a good example of how tabs can go wrong (and how the
tab system /is/ fragile - sorry but it is).
I almost certainly wrote the above using 4 and 8 spaces for the tabs,
except for the 'return 1' where I must have used an actual tab by
mistake. (And I tested it now by doing just that, and posting in alt.test.)
So the original /looked/ correct in my Thunderbird newsreader before I
posted. But after I posted, that tab somehow got changed to 4 spaces, as
it now looks wrong.
In this instance, the result won't compile. But it's not hard to imagine
a much larger program where that change would go unnoticed, and the
result is still valid code**.
Then anyone copying and pasting the posted code, would have a program
with a bug in it.
Mysteriously however, Chris Angelico's reply which quoted my post,
showed a properly tabbed version! (Unless he fixed it manually.)
(** Where working code has been posted, then Python will have picked up
inconsistencies where tabs and spaces are mixed. However take this code:
def fn():
<tab>if a:
<8 spaces>pass
This looks fine in my editor when <tab> is expanded to 4 spaces:
def fn():
if a:
pass
Python however doesn't like it (Python 2 doesn't anyway), because it
somehow assumes tabs expand to 8 spaces, so that the two indents look
like this to it:
def fn():
if a:
pass
So I can see a lot of problems whenever tabs are expanded differently:
a=1
b=0
if a:
<tab>if b:
<tab><tab>print ("One")
<8 spaces>print ("Two")
In my editor with 4-space tabs, it looks like the code will print
nothing as the two print lines are aligned within the 'if b:' block. But
in Python 2, it will print "Two". Python 3 more wisely reports the
inconsistency.)
--
Bartc
--
https://mail.python.org/mailman/listinfo/python-list