To people discussing BNF: The grammar language Python uses is *very* far from BNF. It's more similar to PEG, but even then it's still quite far. Python's grammar is just its own thing, which makes it harder to read, if you are already familiar with other more popular formats.
I've also found bugs in Python parser before, so had this turned out to be a real issue, this wouldn't have been the first time. There are plenty of weird corners in Python grammar that allow unexpected programs to parse (and sometimes even run!), and these are very often connected to assignments, because, in general, assignments in Python are very elaborate and hard to describe / conceptualize about. The most popular example I've even seen used in coding interviews (which I think is a silly gimmick, but that's kind of the whole point of a lot of these interviews...) is: x = [...] for x[i] in x: print(i) Which is not an assignment by itself, but the "weirdness" results from the loop syntax sharing definitions with the "destructuring bind" style of assignment (i.e. where the left-hand side can be an arbitrary complex expression). I was surprised, for example, to learn that "as" in "with_stmt" isn't shared with "as" in "except_block" (so, from the grammar perspective, these are two different keywords), and that asterisk in "except_block" isn't shared with "star_target" (also weird, since you'd think these should be the same thing). In general, and by and large, if you look at Python's grammar there are many "weird" choices that it makes to describe the language which seem counterintuitive to the programmer who tries to learn the language from examples (i.e. context-depending meaning of parenthesis, of asterisk, of period etc.) Having been exposed to this, you'd start to expect that some of this weirdness will eventually result in bugs, or at least in unexpected behavior. ---- Anyways. To the OP: I'm sorry to hijack your question. Below is the complete program: with ( open('example.txt', 'r') as e, open('emails.txt', 'w') as m, open('salutations.txt', 'w') as s, ): for line in e: if line.strip(): (m if '@' in line else s).write(line) it turned out to be not quite the golfing material I was hoping for. But, perhaps a somewhat interesting aspect of this program you don't see used a lot in the wild is the parenthesis in the "with" head. So, it's not a total write-off from the learning perspective. I.e. w/o looking at the grammar, and had I have this code in a coding interview question, I wouldn't be quite sure whether this code would work or not: one way to interpret what's going on here is to think that the expression inside parentheses is a tuple, and since tuples aren't context managers, it wouldn't have worked (or maybe not even parsed as "as" wouldn't be allowed inside tuple definition since there's no "universal as-expression" in Python it's hard to tell what the rules are). But, it turns out there's a form of "with" that has parentheses for decoration purposes, and that's why it parses and works to the desired effect. Since it looks like you are doing this for educational reasons, I think there's a tiny bit of value to my effort. On Fri, Jan 12, 2024 at 8:08 AM Grizzy Adams via Python-list <python-list@python.org> wrote: > > Thursday, January 11, 2024 at 10:44, Rich Shepard via Python-list wrote: > Re: Extract lines from file, add to (at least in part) > > >On Thu, 11 Jan 2024, MRAB via Python-list wrote: > > >> From the look of it: > >> 1. If the line is empty, ignore it. > >> 2. If the line contains "@", it's an email address. > >> 3. Otherwise, it's a name. > > If that is it all? a simple Grep would do (and save on the blank line) > -- > https://mail.python.org/mailman/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list