On Tue, Oct 26, 2021 at 2:05 PM Paul Moore <p.f.mo...@gmail.com> wrote:

> On Tue, 26 Oct 2021 at 16:48, Eric V. Smith <e...@trueblade.com> wrote:
> >
> > And also the "No Loss of Abilities If Removed" section sort of applies
> > to late-bound function arguments: there's nothing proposed that can't
> > currently be done in existing Python. I'll grant you that they might
> > (might!) be more newbie-friendly, but I think the bar is high for
> > proposals that make existing things doable in a different way, as
> > opposed to proposals that add new expressiveness to the language.
>
> One issue with not having an introspection capability, which has been
> bothering me but I've not yet had the time to come up with a complete
> example, is the fact that with this new feature, you have functions
> where there's no way to express "just use the default" without knowing
> what the default actually *is*.
>
> Take for example
>
> def f(a, b=None):
>     if b is None:
>         b = len(a)
>     ...
>
> def g(a, b=>len(a)):
>     ...
>
> Suppose you want to call f as follows:
>
> args = [
>     ([1,2,3], 2),
>     ([4,5,6], None),
>     ([7,8,9], 4),
> ]
>
> for a, b in args:
>     f(a, b)
>
> That works fine. But you cannot replace f by g, because None doesn't
> mean "use the default", and in fact by design there's *nothing* that
> means "use the default" other than "know what the default is and
> supply it explicitly". So if you want to do something similar with g
> (allowing the use of None in the list of tuples to mean "use the
> default"), you need to be able to introspect g to know what the
> default is. You may also need to manipulate first-class "deferred
> expression" objects as well, just to have something you can return as
> the default value (you could return a string and require the user to
> eval it, I guess, but that doesn't seem particularly user-friendly...)
>
> I don't have a good solution for this, unfortunately. And maybe it's
> something where a "good enough" solution would be sufficient. But
> definitely, it should be discussed in the PEP so what's being proposed
> is clear.
>
> Paul
>

I had drafted an entire reply last night trying to explain this same
concern;  Paul Moore, you did a better job. Just want to say I agree: being
able to say "I want the defaults" seems like a useful ability.

But on the other hand, we also must recognize that right now there isn't
really a great, UNIVERSAL way to say "I want the defaults". It varies from
API to API. Many times getting the default means passing None, but many it
is True, or False, or a MISSING sentinel. You have to read the docs to find
out.

Taking PM's examples of f and g, the way you'd have to dynamically call g
this way be:

for arg_group in args:
    g(*arg_group)

But this is going to be limiting because maybe you could also have a
function j, like this:

def j(a, b=None, c=None):
    if b is None:
        b = len(a)
    ...


args = [
    ([1,2,3], 2, "spam"),
    ([4,5,6], None, "eggs"),
    ([7,8,9], 4, "bacon"),
]

for a, b, c in args:
    j(a, b, c)

But with function k below, where the b parameter is deferred, you can't get
the default b parameter by dynamically unpacking some values; you would
have to pass c as a kwd arg:

def k(a, b=>len(a), c=None):
    ...

Seems like it would be- needed? convenient?- to be able to "ask" for the
default in a dynamic way... Am I making more of this than is justified?

---
Ricky.

"I've never met a Kentucky man who wasn't either thinking about going home
or actually going home." - Happy Chandler
_______________________________________________
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/E6JHPA3KBO6RXLUBVRHJGVMYQFKQEBBZ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to