On 2021-12-02 15:40, Chris Angelico wrote:
Actually, no. I want to put the default arguments into the signature,
and the body in the body. The distinction currently has a technical
restriction that means that, in certain circumstances, what belongs in
the signature has to be hacked into the body. I'm trying to make it so
that those can be put where they belong.
Chris, I know this is probably not your intention, but I feel the
discussion is continually muddle by you just saying "default arguments"
as if everyone agrees on what those are and the issue is just where to
put them. But clearly that is not the case. You seem to take it for
granted that "len(x) evaluated when the function is called" "is" a
"default argument" in the same sense that an early-bound default like
the number 3 is. I do not agree, and it's pretty clear David Mertz does
not agree, and I think there are others here who also do not agree.
It's not as is there is some pre-existing notion of "default argument"
in Python and you are just proposing to add an implementation of it that
was left out due to some kind of oversight. Your proposal is CHANGING
the idea of what a default argument is. I get that it's natural to
refer to your new proposal as "default arguments" but I've now seen a
number of messages here where you say "but no we should do X because
this is a default argument", taking for granted that what you're talking
about is already agreed to be a default argument. (No doubt I and many
others are also guilty of similar missteps by saying "default argument"
as a shorthand for something or other, and I'll try to be careful about
it myself.)
By my definition as of now, a default argument has to be an object.
Thus what your proposal envisions are not default arguments. You can't
just say "I want to do this with default arguments". You need to
provide an argument for why we should even consider these to be default
arguments at all.
Perhaps a way of stating this without reference to arguments is this:
you want to put code in the function signature but not have it executed
until the function is called. I do not agree with that choice. The
function signature and the function body are different syntactic
environments with different semantics. Everything in the function
signature should be executed when the function is defined (although of
course that execution can result in an object which contains deferred
behavior itself, like if we pass a function as an argument to another).
Only the function body should be executed when the function is called.
If we want to provide some way to augment the function body to assign
values to missing arguments, I wouldn't rule that out completely, but in
my view the function signature is not an available space for that. The
function signature is ONLY for things that happen when the function is
defined. It is too confusing to have the function signature mix
definition-time and call-time behavior.
--
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/4B3GTCFZILOLNF6YYTRCW5I3UHVBS3VG/
Code of Conduct: http://python.org/psf/codeofconduct/