On 2021-12-04 03:50, Chris Angelico wrote:
On Sat, Dec 4, 2021 at 8:48 PM Steven D'Aprano <st...@pearwood.info> wrote:
And third, when the interpreter fetches a default from
func.__defaults__, if it is a LB function, it automatically calls that
function with the parameters to the left of x (which in this case
would be just b).
Plausible. Okay.
What this does mean, though, is that there are "magic objects" that
cannot be used like other objects. Consider:
Your proposal also has the same problem, since it involves "magic
functions" that do not have usable values for their argument defaults,
instead having some kind of Ellipsis two-step. It's all a matter of
what you consider magic.
Great. So now we have some magnificently magical behaviour in the
language, which will have some nice sharp edge cases, but which nobody
will ever notice. Totally. I'm sure. Plus, we pay a performance price
in any function that makes use of argument references, not just for
the late-bound default, but in the rest of the code. We also need to
have these special functions that get stored as separate code objects.
All to buy what, exactly? The ability to manually synthesize an
equivalent parameter value, as long as there's no assignment
expressions, no mutation, no other interactions, etc, etc, etc? That's
an awful lot of magic for not a lot of benefit.
I would consider most of what you say here an accurate description of
your own proposal. :-)
Now we have magnificently magical behavior in the language, which will
take expressions in the function signature and behind the scenes
"inline" them into the function body. We also need to have these
special function arguments that do NOT get stored as separate objects,
unlike ordinary function arguments. All to buy what, exactly? The
ability to write something in the function signature that we can already
write in the body, and that quite naturally belongs in the body, because
it is executed when the function is called, not when it is defined.
I *really* don't like the idea that some types of object will be
executed instead of being used, just because they have a flag set.
That strikes me as the sort of thing that should be incredibly scary,
but since I can't think of any specific reasons, I just have to call
it "extremely off-putting".
I *really* don't like the idea that some types of argument will be
inlined into the function body instead of being stored as first-class
values like other `__defaults__`, just because there happens to be this
one extra character next to the equals sign in the function signature.
That strikes me as the sort of thing that should be incredibly scary.
--
Brendan Barnwell
"Do not follow where the path may lead. Go, instead, where there is no
path, and leave a trail."
--author unknown
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/python-ideas@python.org/message/CKSNACEI2U2VHAMBLCRQRCSKJ52WYH33/
Code of Conduct: http://python.org/psf/codeofconduct/