Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #45833 > unrolled thread

Non-identifiers in dictionary keys for **expression syntax

Started byMatthew Gilson <m.gilson1@gmail.com>
First post2013-05-23 14:52 -0400
Last post2013-05-23 16:49 -0400
Articles 4 — 3 participants

Back to article view | Back to comp.lang.python


Contents

  Non-identifiers in dictionary keys for **expression syntax Matthew Gilson <m.gilson1@gmail.com> - 2013-05-23 14:52 -0400
    Re: Non-identifiers in dictionary keys for **expression syntax Neil Cerutti <neilc@norwich.edu> - 2013-05-23 19:20 +0000
      Re: Non-identifiers in dictionary keys for **expression syntax Ethan Furman <ethan@stoneleaf.us> - 2013-05-23 12:37 -0700
      Re: Non-identifiers in dictionary keys for **expression syntax Matthew Gilson <m.gilson1@gmail.com> - 2013-05-23 16:49 -0400

#45833 — Non-identifiers in dictionary keys for **expression syntax

FromMatthew Gilson <m.gilson1@gmail.com>
Date2013-05-23 14:52 -0400
SubjectNon-identifiers in dictionary keys for **expression syntax
Message-ID<mailman.2029.1369335137.3114.python-list@python.org>

[Multipart message — attachments visible in raw view] — view raw

This is a question regarding the documentation around dictionary 
unpacking.  The documentation for the call syntax 
(http://docs.python.org/3/reference/expressions.html#grammar-token-call) 
says:

"If the syntax **expression appears in the function call, expression 
must evaluate to a mapping, the contents of which are treated as 
additional keyword arguments."

That's fine, but what is a keyword argument?  According to the glossary 
(http://docs.python.org/3.3/glossary.html):

/"keyword argument/: an argument preceded by an identifier (e.g. name=) 
in a function call or passed as a value in a dictionary preceded by **."

As far as I'm concerned, this leads to some ambiguity in whether the 
keys of the mapping need to be valid identifiers or not.

Using Cpython, we can do the following:

      def func(**kwargs):
           print kwargs

      d = {'foo bar baz':3}

So that might lead us to believe that the keys of the mapping do not 
need to be valid identifiers.  However, the previous function does not 
work with the following dictionary:

     d = {1:3}

because not all the keys are strings.  Is there a way to petition to get 
this more rigorously defined?

Thanks,
~Matt



[toc] | [next] | [standalone]


#45835

FromNeil Cerutti <neilc@norwich.edu>
Date2013-05-23 19:20 +0000
Message-ID<b078gcF5qh7U1@mid.individual.net>
In reply to#45833
On 2013-05-23, Matthew Gilson <m.gilson1@gmail.com> wrote:
> That's fine, but what is a keyword argument?  According to the glossary 
> (http://docs.python.org/3.3/glossary.html):
>
> /"keyword argument/: an argument preceded by an identifier (e.g. name=) 
> in a function call or passed as a value in a dictionary preceded by **."
>
> As far as I'm concerned, this leads to some ambiguity in
> whether the keys of the mapping need to be valid identifiers or
> not.

I don't see any ambiguity. A keyword argument is an argument
preceded by an identifier according to the definition. Where are
you perceiving wiggle room?

-- 
Neil Cerutti

[toc] | [prev] | [next] | [standalone]


#45837

FromEthan Furman <ethan@stoneleaf.us>
Date2013-05-23 12:37 -0700
Message-ID<mailman.2032.1369339060.3114.python-list@python.org>
In reply to#45835
On 05/23/2013 12:20 PM, Neil Cerutti wrote:
> On 2013-05-23, Matthew Gilson <m.gilson1@gmail.com> wrote:
>>
>> That's fine, but what is a keyword argument?  According to the glossary
>> (http://docs.python.org/3.3/glossary.html):
>>
>> /"keyword argument/: an argument preceded by an identifier (e.g. name=)
>> in a function call or passed as a value in a dictionary preceded by **."
>>
>> As far as I'm concerned, this leads to some ambiguity in
>> whether the keys of the mapping need to be valid identifiers or
>> not.
>
> I don't see any ambiguity. A keyword argument is an argument
> preceded by an identifier according to the definition. Where are
> you perceiving wiggle room?

--> def func(**kwargs):
...     print(kwargs)
...

--> d = {'foo bar baz':3}

--> func(**d)
{'foo bar baz': 3}

Even though 'foo bar baz' is not a valid identifier, and could not be passed as `func(foo bar baz = 3)`, it still worked 
when going through a dict.

--
~Ethan~

[toc] | [prev] | [next] | [standalone]


#45844

FromMatthew Gilson <m.gilson1@gmail.com>
Date2013-05-23 16:49 -0400
Message-ID<mailman.2036.1369342164.3114.python-list@python.org>
In reply to#45835
On 05/23/2013 03:20 PM, Neil Cerutti wrote:
> On 2013-05-23, Matthew Gilson <m.gilson1@gmail.com> wrote:
>> That's fine, but what is a keyword argument?  According to the glossary
>> (http://docs.python.org/3.3/glossary.html):
>>
>> /"keyword argument/: an argument preceded by an identifier (e.g. name=)
>> in a function call or passed as a value in a dictionary preceded by **."
>>
>> As far as I'm concerned, this leads to some ambiguity in
>> whether the keys of the mapping need to be valid identifiers or
>> not.
> I don't see any ambiguity. A keyword argument is an argument
> preceded by an identifier according to the definition. Where are
> you perceiving wiggle room?
>
The wiggle room comes from the "or passed as a value in a dictionary" 
clause.  We sort of get caught in a infinite loop there because the 
stuff that can be passed in a dictionary is a keyword which is an 
identifer=expression or something passed as a value in a dictionary ...

Also the fact that:

      func(**{"foo bar baz":1})

works even though `foo bar baz` isn't a valid identifier, but:

      func(**{1:3})

doesn't work.

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.python


csiph-web