On Thu, Aug 06, 2020 at 02:46:01PM +0100, MRAB wrote:
> On 2020-08-06 14:16, Stestagg wrote:

> > In the "New syntax", wouldn't these examples map to:
> >
> > d[1, 2, a=3]  =>  d.__getitem__((1, 2), a=3)
> > and
> > d[(1, 2), a=3]  =>  d.__getitem__((1, 2), a=3)

That is certainly what I would expect. All positional arguments are 
packed into a single positional parameter, and any keyword arguments 
passed separately.

Any current subscript dunder is likely to look like this:

    def __getitem__(self, index):  # or key, whatever

i.e. it will only have a single positional argument. (Aside from self of 
course.)


> Not quite. The second should be:
> 
> d[(1, 2), a=3]  =>  d.__getitem__(((1, 2),), a=3)

Aside from the keyword argument, which is a syntax error, that's not 
what happens now.


    py> class Demo:
    ...     def __getitem__(self, index):
    ...             print(index, type(index))
    ... 
    py> d = Demo()
    py> d[(1, 2)]  # Tuple single arg.
    (1, 2) <class 'tuple'>
    py> d[1, 2]  # Still a tuple.
    (1, 2) <class 'tuple'>


Adding a keyword arg should not change this.



[Stestagg]
> > I.e. My understanding was that the existing conversion of all 
> > positional parameters in a subscript would be packed into a tuple 
> > (strictly for consistency with legacy behaviour) while any keywords 
> > would be passed as kwargs?

To be clear, a single argument is not packed into a tuple.

I think that what is actually going on is a matter of precedence. Commas 
do double duty, separating arguments in calls and creating tuples. 
Inside a function call, the argument separate takes priority:

    func(1, 2, 3)

is interpreted as three arguments separated by commas. If you want a 
tuple, you need to change the priority by using round brackets:

    func((1, 2, 3))

But inside a subscript, there is currently no concept of multiple 
arguments. There's always only one item, and commas just have their 
normal meaning of creating a tuple.

I think that's how it works, but I'm not quite good enough at reading 
the grammar specs to be sure.

https://docs.python.org/3/reference/grammar.html


-- 
Steven
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/WPS2KEUY54MXB4JBOLG2C5RULS2AXPFX/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to