On Tue, Oct 26, 2021 at 5:50 AM Erik Demaine <[email protected]> wrote:
> But you're definitely right that it's easier to give permissions later than
> take them away, and there are two natural left-to-right orders...
>
> Speaking of implementation as Guido just raised, maybe going with what makes
> the most sense in the implementation would be fitting here? I'm guessing it's
> left-to-right overall (among all arguments), which is also the
> simpler-to-explain rule. I would actually find it pretty weird for references
> to arguments to the right to make sense even if they could...
>
> Actually, if we use the left-to-right overall order, this is the more
> conservative choice. If code worked with that order, and we later decided
> that the two-pass default assignment is better, it would be
> backward-compatible (except that some previously failing code would no longer
> fail).
Maybe I'm overthinking the parallels with existing idioms. There is no
current idiom which can be described as having a perfect correlation,
so maybe it's best to just describe all of them as very rough
approximations, and think solely about the behaviour of a function in
a post-PEP-671 world. Let's try this.
* Function parameters *
A function receives some number of parameters as defined by its
signature. When a function is called, parameters get assigned their
values in the order that they are listed; either they are assigned an
argument as given by the caller, or the default given in the
signature. For example:
def parrot(voltage, state='a stiff', action=>rand_verb(),
type='Norwegian Blue'):
print("This parrot wouldn't", action)
...
parrot('a million', 'bereft of life')
This behaves as if you wrote:
def parrot():
voltage = 'a million'
state = 'bereft of life'
action = rand_verb()
type = 'Norwegian Blue'
print("This parrot wouldn't", action)
...
***
We can continue to bikeshed the precise syntax, but I think the
semantics of pure left-to-right make very good sense.
Will have to get an implementation together before being sure, though.
> On Tue, 26 Oct 2021, Chris Angelico wrote:
>
> >> Personally, I'd expect to use late-bound defaults almost all or all the
> >> time;
> >> [...]
> >
> > Interesting. In many cases, the choice will be irrelevant, and
> > early-bound is more efficient. There aren't many situations where
> > early-bind semantics are going to be essential, but there will be huge
> > numbers where late-bind semantics will be unnecessary.
>
> Indeed; you could even view those cases as optimizations, and convert
> late-bound immutable constants into early-bound defaults. (This optimization
> would only be completely equivalent if we stick to a global left-to-right
> ordering, though.)
Yeah. And that's another good reason to keep the two default syntaxes
as similar as possible - no big keyword adornment like "deferred" - so
that code isn't unnecessarily ugly for using more early-bound
defaults.
ChrisA
_______________________________________________
Python-ideas mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/2S74ISUMJ3L42EP2GQSKZKNH6UC5GONE/
Code of Conduct: http://python.org/psf/codeofconduct/