On 02.03.2017 13:22, Stephan Houben wrote: > 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.
Yes. > Would this also apply if we provide or capture the keyword arguments using > ** ? > > I.e. > f(**{"x": NoDict}) I think you meant NoDefault here. > (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. Continuing the example, this case would throw an error as well: kwargs = {'x': NoDefault) f(**kwargs) e.g. TypeError('x is a positional only parameter') However, only because f "declared" x as optional positional parameter. If you'd pass the same dict to a function g as in: def g(x): pass g(**kwargs) it would not raise an exception, since Python functions always allow passing in keyword parameters for positional parameters (unlike C functions, which only allow this if configured that way). > 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/ >> >> > -- 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/