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/

Reply via email to