On 11/07/2020 06:22, Олег Комлев wrote:
Just to spell it out: If I understand you correctly, you are
proposing that after a 'for'/'while' loop
ELSE-clause in FOR and WHILE has unclear syntax. I suggest new clause instead:
This IF-clause like must be immediately after FOR- or WHILE-cycle (only comment allowed between). It looks like a regular IF, but COND is special.
COND may be "break", "pass" or "finally". "if break:" - if used break-operator to exit cycle. "if pass:" - cycle executed 0 times. "if finally:" - cycle executed 0 or more times ("pass-case" is included in "finally-case"). For compatibility only "else:" means "if finally:".
It's compatible enhancement. No new keyword. There can be no combination "break", "pass" or "finally" after "if"/"elif:" in current version.
This idea was suggested as enhancement issue (https://bugs.python.org/issue41272).
Eric V. Smith (eric.smith) advised me to put this on the python-ideas mailing list (https://bugs.python.org/issue41272#msg373486).
'if break:' has its intuitive meaning: "if the loop was
terminated with a 'break'".
'if finally:' means "if the loop completed (possibly with zero
iterations) without a 'break'"
(equivalent to 'else' at present).
'if pass:' means "if there were zero iterations of the loop
(obviously, without a 'break')"
(I assume that a partial iteration terminated by 'continue'
would count as an iteration)
plus 'elif' when you want to handle more than one of the above. So
would be legal, but
Something to consider: Would it be legal to mix these CONDs with
other conditions in the 'elif' chain? E.g.
elif x > 0:
I would be the first to agree that the use of 'else' after
'for'/'while' is one of Python's more obscure features (I understand
even veterans trip up over it).
I like the general idea and I like 'if break:', but IMO the meanings
of the other two are not obvious.
I would suggest 'if not break:' rather than 'if finally:'. (And PEP
8 could recommend it rather than 'else:'. :-))
My gut feeling (backed by no evidence) is that dealing with the case
of zero iterations is not needed frequently enough to cater for it.
And I don't know if there is a good way to spell it (which might be
another reason not to do it).
Plus it's something which could be added later.