
On Tue, Oct 26, 2021 at 08:59:51AM +0100, Rob Cliffe via Python-ideas wrote:
And I don't understand what point you're making here. Yes, the walrus operator can appear in various places, how is that relevant? You could write def f(a := (b := c)): which might be a tad confusing but would be unambiguous and legal, just as def f(a = (b := c)): is currently legal (I tested it). I don't see a clash.
If we have a choice between a dozen syntax variants that are not confusing, and one which is confusing, why would we prefer to pick the one that is confusing over any of the others?
Perhaps I wasn't clear. When I said 'inefficiency', I meant to refer to cases like def f(a := b+1, b := e+1, c := a+1, d := 42, e := d+1) where late-binding defaults are allowed to refer to subsequent arguments. Here Python has to work out to assign first to d, then e, then b, then a, and finally c, which AFAICS requires multiple passes.
No, I don't think we need to do anything that intricate. It is not the responsibility of the interpreter to **make it work** no matter what, any more than we expect the interpreter to make this work: a = b + 1 b = e + 1 c = a + 1 d = 42 # <<<<<-----start here e = d + 1 It is enough to have a simple rule: - bind early bound defaults left to right first; - bind late bound defaults left to right next. (That's my preference.) Even simpler would be a strictly left-to-right single pass but that would be, I think, too simple. YMMV. I'm not prepared to fight to the death over that one :-) -- Steve