Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.python > #45833 > unrolled thread
| Started by | Matthew Gilson <m.gilson1@gmail.com> |
|---|---|
| First post | 2013-05-23 14:52 -0400 |
| Last post | 2013-05-23 16:49 -0400 |
| Articles | 4 — 3 participants |
Back to article view | Back to comp.lang.python
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
| From | Matthew Gilson <m.gilson1@gmail.com> |
|---|---|
| Date | 2013-05-23 14:52 -0400 |
| Subject | Non-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]
| From | Neil Cerutti <neilc@norwich.edu> |
|---|---|
| Date | 2013-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]
| From | Ethan Furman <ethan@stoneleaf.us> |
|---|---|
| Date | 2013-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]
| From | Matthew Gilson <m.gilson1@gmail.com> |
|---|---|
| Date | 2013-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