[Python-ideas] Tighten up the formal grammar and parsing a bit?
steve at pearwood.info
Mon May 15 09:00:15 EDT 2017
On Mon, May 15, 2017 at 08:13:48PM +1000, Chris Angelico wrote:
> On Mon, May 15, 2017 at 7:38 PM, Hugh Fisher <hugo.fisher at gmail.com> wrote:
> > I wrote this little Python program using CPython 3.5.2. It's ...
> > interesting ... that we apparently don't need comments or pass
> > statements any more. Anyone else think it might be worth tightening up
> > the grammar definition and parser a bit?
I agree with that. But not necessarily the following:
> For starters, you shouldn't be using "pass" statements OR dummy
> strings to fill in an if statement's body; you can instead simply
> if x <= 0:
> x += 1
That is often the case, but there are times where a condition is clearer
with a pass statement followed by an else than by reversing the sense of
the test. Or the pass might just be a place-holder: TDD often means that
there's code where only one branch of an if works (and it's not
necessarily the if branch).
pass # will be fixed in the next iteration of TDD
There's also cases where
if x > y:
is *not necessarily* the same as
if not (x > y):
(x > y) is not always not(x <= y). E.g. sets, and even floats.
> For the rest, all you've shown is that trivial expressions consisting
> only of string literals will be ignored in certain contexts.
> The trouble is that string literals don't really mean comments, and won't
> be ignored by most humans;
Bare string literals do sometimes mean comments, and I should hope they
aren't ignored by the reader!
E.g. bare strings at the start of a module, class or function are
docstrings, and even in the middle of the module or function, they are
allowed. Guido has spoken! (Unless he's changed his mind since then :-)
> plus, there are contexts where they are not ignored.
Oh, and here I was thinking strings were ignored everywhere!
print("hello world") # does nothing
But seriously, of course *expression statements* which are string
literals are not syntactically comments, but they can be, and are,
treated as if they were. Just use a bit of common sense.
Here, rewrite this without comments:
> wrong_answer_messages = [
> "Totally wrong, you moron.",
> "Bob, you idiot, that answer is not right. Cordially, Ted.", # Maize
> "That's as useful as a screen door on a battleship.", # BTTF
> # etc
> String literals won't work here, and even if they did, they would be
> _extremely_ confusing.
That's because the statement is an assignment statement, not an
> Comments are semantically distinct.
> The 'pass' statement has a very specific meaning and only a few
> use-cases. It could often be omitted in favour of something else, but
> there's not a lot of value in doing so. Comments have very significant
> value and should definitely be kept.
Oh, I see where you are coming from! You have interpreted Hugh as
suggesting that we remove pass and # comments from the language! I
interpreted him as suggesting the opposite: that we tighten up the
grammar to prohibit bare expressions, in order to prevent them from
being used instead of pass or # comments.
More information about the Python-ideas