
I just want to note that this is just a gentle suggestion/observation, in case this wasn’t done yet. I am not pushing this. —— All good points, thank you. —— Why would this not be a good option? 1 extra line compared to walrus, but no DRY issue. with open(“fn") as f: while True: line = f.readline() if line and check(line): process(line) else: break DG
On 9 Oct 2023, at 15:52, Stephen J. Turnbull <turnbull.stephen.fw@u.tsukuba.ac.jp> wrote:
Dom Grigonis writes:
Mistake, late night. I just meant to portray initialisation via walrus inside statement, nothing more. It doesn’t work with while loop.
It *does* work with a while loop, just not that one. See below. The problem is that you're writing new code full of trash you don't need to explain the concept. Keep these examples as simple as possible. For example, my "pass" example is too simple if you want to show how the walrus can save typing because it doesn't save any lines of code; you need something a little more complicated to demonstrate that saving.
In the progress of any proposal to acceptance, at some point someone is going to say, "I see that it works and solves a theoretical problem, but who would ever use it?" At that point you go into a large body of code such as the Python standard library or numpy to find realistic examples. But that's old code, and only needed to demonstrate actual utility.
Generally, this would be useful for all examples of https://peps.python.org/pep-0572/ <https://peps.python.org/pep-0572/> , where “initial” value is an attribute or dictionary item.
That's not the question though. The question is are those examples themselves frequently useful. And that's when you go find them in the stdlib.
I see. Could you give an example of this? I vaguely remember this sometimes being the case, but can not find anything now on this in relation to walrus operator. Is there no way to bring that execution within the body without walrus operator?
The problem is code like this:
with open("a_file") as f: while (line := f.readline()) if check(line): process(line) else: break
There is no way to do that without an assignment, and without the walrus you need an assignment before the while, and the same assignment within the loop body. Is that a big deal? No. In fact, I have never used the walrus operator in anger, nor wanted to. I'm just as happy to write
with open("a_file") as f: line = f.readline() while (line) if check(line): process(line) else: break line = f.readline()
But some people find loop-and-a-half extremely ugly, and while I differ on "extremely", I can't deny that it's ugly.
You *could* do this for small files with
with open("a_file") as f: lines = f.readlines() for (line in lines): if check(line): process(line) else: break
but that's not possible with an infinite iterable, undesireable for most non-file streams, etc.
Re "simple examples", see why I used the "if check()" stuff? If I wasn't going to talk about infinite iterables and pausing external streams, that would just be (potentially wrong!) complexity that doesn't help explain anything.
Steve