OK, I get it, I think.

I presume it is really the object identity which matters, not the syntax,
so:

y = NoDefault
f(x=y)

would be equally an error.

Would this also apply if we provide or capture the keyword arguments using
** ?

I.e.
f(**{"x": NoDict})

(lambda **kw: kw)(x=NoDict)

In that case I see a problem with this idiom:

newdict = dict(**olddict)

This would now start throwing errors in case any of the values of olddict
was NoDefault.

Stephan



2017-03-02 13:08 GMT+01:00 M.-A. Lemburg <m...@egenix.com>:

> On 02.03.2017 12:31, Stephan Houben wrote:
> > I am not sure if I fully understand the proposal then.
> >
> > NoDefault would be special syntax so that this would be disallowed:
> >
> > f(NoDefault)
> >
> > but this would be allowed:
> > def f(x=NoDefault):
> >    ...
> >
> > and also this:
> >
> > x is NoDefault
> >
> > So this would seem to require an exhaustive list of syntactic contexts
> > in which NoDefault is allowed. I mean, can I do:
> >
> > x = NoDefault
> >
> > ?
> >
> > I observe that I can always get to the underlying NoDefault object in
> this
> > way:
> >
> > (lambda x=NoDefault:x)()
> >
> > So what happens if I do:
> >
> > f((lambda x=NoDefault:x)())
> >
> > ?
>
> Sorry for the confusion. NoDefault would be usable just like
> any other singleton.
>
> There would only be one case where it would cause an exception,
> namely when you declare a parameter as having NoDefault as value.
> This would trigger special logic in the argument parsing code to
> disallow using that parameter as keyword parameter.
>
> Example:
>
> def f(x=NoDefault):
>     # x is an optional positional parameter
>     if x is NoDefault:
>         # x was not passed in as parameter
>         ...
>     else:
>         # x was provided as parameter
>         ...
>
> These would all work fine:
>
> f()
> f(1)
> f(None)
>
> This would trigger an exception in the argument parsing code:
>
> f(x=NoDefault)
>
> e.g. TypeError('x is a positional only parameter')
>
> This would not trigger an exception:
>
> f(NoDefault)
>
> since x is not being used as keyword parameter and the
> function f may want to pass the optional positional parameter
> down to other functions with optional positional paramters
> as well.
>
> Is this clearer now ?
>
> Note: The name of the singleton could be something else
> as well, e.g. NoKeywordParameter :-)
>
> > Stephan
> >
> >
> > 2017-03-02 12:15 GMT+01:00 M.-A. Lemburg <m...@egenix.com>:
> >
> >> On 02.03.2017 11:22, Stephan Houben wrote:
> >>> In cases like this I would recommend creating the sentinel yourself:
> >>>
> >>> NoDefault = object()
> >>>
> >>> def get(store, key, default=NoDefault):
> >>>    if default is NoDefault:
> >>>         # do something
> >>>
> >>> You can arrange to not export NoDefault so that the client code cannot
> >> even
> >>> access
> >>> the sentinel value.
> >>
> >> Yes, I know... I've been using the mxTools NotGiven since 1998.
> >>
> >>> This is strictly preferable over having yet another global
> >>> value meaning "no value", since that just moves the goal posts:
> >>> clients will complain they cannot pass in a default=NoDefault and get
> >> back
> >>> NoDefault.
> >>
> >> Not really. NoDefault would mean: no value provided, not that
> >> you don't want a value. As a result, passing NoDefault would
> >> not be allowed, since then you'd be providing a value :-)
> >>
> >>> Stephan
> >>>
> >>>
> >>> 2017-03-02 11:04 GMT+01:00 M.-A. Lemburg <m...@egenix.com>:
> >>>
> >>>> On 02.03.2017 10:06, Serhiy Storchaka wrote:
> >>>>> On 02.03.17 10:36, M.-A. Lemburg wrote:
> >>>>>> Why a new syntax ? Can't we just have a pre-defined sentinel
> >>>>>> singleton NoDefault and use that throughout the code (and also
> >>>>>> special case it in argument parsing/handling)?
> >>>>>>
> >>>>>> def get(store, key, default=NoDefault):
> >>>>>>     if store.exists(key):
> >>>>>>         return store.retrieve(key)
> >>>>>>     ...
> >>>>>
> >>>>> This means adding a new syntax. NoDefault should be a keyword (we can
> >>>>> reuse existing keyword couldn't be used in expression), and it should
> >> be
> >>>>> accepted only in the specific context of declaring function
> parameter.
> >>>>
> >>>> This is not new syntax, nor is it a keyword. It's only a
> >>>> new singleton and it is well usable outside of function
> >>>> declarations as well, e.g. for class attributes which are
> >>>> not yet initialized (and which can accept None as value).
> >>>>
> >>>> The only special casing would be in function call
> >>>> parameter parsing to signal errors when the parameter
> >>>> is used as keyword parameter.
> >>>>
> >>>> --
> >>>> Marc-Andre Lemburg
> >>>> eGenix.com
> >>>>
> >>>> Professional Python Services directly from the Experts (#1, Mar 02
> 2017)
> >>>>>>> Python Projects, Coaching and Consulting ...
> http://www.egenix.com/
> >>>>>>> Python Database Interfaces ...
> http://products.egenix.com/
> >>>>>>> Plone/Zope Database Interfaces ...
> http://zope.egenix.com/
> >>>> ____________________________________________________________
> >> ____________
> >>>>
> >>>> ::: We implement business ideas - efficiently in both time and costs
> :::
> >>>>
> >>>>    eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48
> >>>>     D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
> >>>>            Registered at Amtsgericht Duesseldorf: HRB 46611
> >>>>                http://www.egenix.com/company/contact/
> >>>>                       http://www.malemburg.com/
> >>>>
> >>>> _______________________________________________
> >>>> Python-ideas mailing list
> >>>> Python-ideas@python.org
> >>>> https://mail.python.org/mailman/listinfo/python-ideas
> >>>> Code of Conduct: http://python.org/psf/codeofconduct/
> >>>>
> >>>
> >>>
> >>>
> >>> _______________________________________________
> >>> Python-ideas mailing list
> >>> Python-ideas@python.org
> >>> https://mail.python.org/mailman/listinfo/python-ideas
> >>> Code of Conduct: http://python.org/psf/codeofconduct/
> >>>
> >>
> >> --
> >> Marc-Andre Lemburg
> >> eGenix.com
> >>
> >> Professional Python Services directly from the Experts (#1, Mar 02 2017)
> >>>>> Python Projects, Coaching and Consulting ...  http://www.egenix.com/
> >>>>> Python Database Interfaces ...           http://products.egenix.com/
> >>>>> Plone/Zope Database Interfaces ...           http://zope.egenix.com/
> >> ____________________________________________________________
> ____________
> >>
> >> ::: We implement business ideas - efficiently in both time and costs :::
> >>
> >>    eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48
> >>     D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
> >>            Registered at Amtsgericht Duesseldorf: HRB 46611
> >>                http://www.egenix.com/company/contact/
> >>                       http://www.malemburg.com/
> >>
> >>
> >
>
> --
> Marc-Andre Lemburg
> eGenix.com
>
> Professional Python Services directly from the Experts (#1, Mar 02 2017)
> >>> Python Projects, Coaching and Consulting ...  http://www.egenix.com/
> >>> Python Database Interfaces ...           http://products.egenix.com/
> >>> Plone/Zope Database Interfaces ...           http://zope.egenix.com/
> ________________________________________________________________________
>
> ::: We implement business ideas - efficiently in both time and costs :::
>
>    eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48
>     D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
>            Registered at Amtsgericht Duesseldorf: HRB 46611
>                http://www.egenix.com/company/contact/
>                       http://www.malemburg.com/
>
>
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to