On Sun, Oct 31, 2021 at 1:03 PM Brendan Barnwell <brenb...@brenbarn.net> wrote:
>
> On 2021-10-30 18:29, Chris Angelico wrote:
> >> >         What I am saying is that there is a qualitative difference 
> >> > between "I
> >> >know now (at function definition time) what value to use for this
> >> >argument if it's missing" and "I know now (at function definition time)
> >> >*what I will do*  if this argument is missing".  Specifying "what you
> >> >will do" is naturally what you do inside the function.  It's a process
> >> >to be done later, it's logic, it's code.  It is not the same as
> >> >finalizing an actual VALUE at function definition time.  So yes, there
> >> >is a qualitative difference between:
> >> >
> >> ># this
> >> >if argument is undefined:
> >> >         argument = some_constant_value
> >> >
> >> ># and this
> >> >if argument is undefined:
> >> >         # arbitrary code here
> >> >
> >> >         I mean, the difference is that in one case arbitrary code is 
> >> > allowed!
> >> >That's a big difference.
> > Right. That is a very real difference, which is why there is a very
> > real difference between early-bound and late-bound defaults. But both
> > are argument defaults.
>
>         I don't 100% agree with that.
>
>         I mean, here's another way to come at this.  Suppose we have this 
> under
> the proposal (using some random syntax picked at random):
>
> def foo(a=1, b="two", c@=len(b), d@=a+c):
>
>         You keep saying that c and d "are argument default" just like a and b.
>   So can you tell me what the argument default for each of those arguments?

The default for a is the integer 1. The default for b is the string
"two". The default for c is the length of b. The default for d is the
sum of a and c.

>         The default for argument a is an integer.  The default for argument b
> is a string.  Can you tell me, in comparable terms, what the defaults
> for arguments c and d are?

You're assuming that every default is a *default value*. That is the
current situation, but it is by no means the only logical way a
default can be defined. See above: c's default is the length of b,
which is presumably an integer, and d's default is the sum of that and
a, which is probably also an integer (unless a is passed as a float or
something).

>         Currently, every argument default is a first-class value.  As I
> understand it, your proposal breaks that assumption, and now argument
> defaults can be some kind of "construct" that is not a first class
> value, not any kind of object, just some sort of internal entity that no
> one can see or manipulate in any way, it just gets automatically
> evaluated later.
>
>         I really don't like that.  One of the things I like about Python is 
> the
> "everything is an object" approach under which most of the things that
> programmers work with, apart from a very few base syntactic constructs,
> are objects.  Many previous expansions to the language, like decorators,
> context managers, the iteration protocol, etc., worked by building on
> this object model.  But this proposal seems to diverge quite markedly
> from that.

What object is this?

a if random.randrange(2) else b

Is that an object? No; it's an expression. It's a rule. Not EVERYTHING
is an object. Every *value* is an object, and that isn't changing. Or
here, what value does a have?

def f():
    if 0: a = 1
    print(a)

Does it have a value? No. Is it an object? No. The lack of value is
not itself a value, and there is no object that represents it.

>         If the "late-bound default" is not an object of some kind just like 
> the
> early-bound ones are, then I can't agree that both "are argument defaults".
>

Then we disagree. I see them both as perfectly valid defaults - one is
a default value, the other is a default expression.

ChrisA
_______________________________________________
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/YXU74N35DBDZE6O3TZYWGIUHJYT6NCZD/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to