> How could that be avoided? by definition, early bound is evaluated "earlier" than late-bound :-)
>
> This could cause a bit of confusion with "getting" that it's not a simple left-to-right rule, but that's the same potential confusion with early vs late bound parameters anyway.
sorry, got tangled up between "evaluating" and "name binding"
The question is whether code like this should work:
def f(a=>b + 1, b=2): ...
f()
f(b=4)
Pure left-to-right assignment would raise UnboundLocalError in both
cases. Tiered evaluation wouldn't.
Nice, simple example. I'm not a newbie, but my students are, and I think they'd find "tiered" evaluation really confusing.
Are there any other places in Python where assignments aren't done
left to right, but are done in two distinct phases?
I sure can't think of one.
I've been thinking about this from the perspective of a teacher or Python. I"m not looking forward to having one more thing to teach about function definitions -- I struggle enough with cover all of the *args, **kwargs, keyword-only, positional-only options.
Python used to be such a simple language, not so much anymore :-(
That being said, we currently have to teach, fairly early on, the consequences of using a mutable as a default value. And this PEP would make that easier to cover. But I think it's really important to keep the semantics as simple as possible, and left-to-right name binding is they way to do that.
(all this complicated by the fact that there is a LOT of code and advice in the wild about the None idiom, but what can you do?)
-CHB
-- Christopher Barker, PhD (Chris)
Python Language Consulting
- Teaching
- Scientific Software Development
- Desktop GUI and Web Development
- wxPython, numpy, scipy, Cython