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/