On Thu, Aug 20, 2020 at 10:31 AM Guido van Rossum <guido@python.org> wrote:

On Thu, Aug 20, 2020 at 05:57 Random832 <random832@fastmail.com> wrote:

I have an implementation proposal that I believe is distinct from any of the ones mentioned in the PEP currently.

Pass keyword arguments as ordinary keyword arguments [which any particular __getitem__ implementation is free to handle as **kwargs, specific keywords, or simple named arguments]. When a single positional argument is passed, it's used directly; when zero or two or more are passed, they are bundled into a tuple and passed as a single positional argument. Having zero arguments result in an empty tuple allows for easy conceptual compatibility with numpy.

d[]: d.__getitem__(())

d[0] : d.__getitem__(0)

d[0,1] : d.__getitem__((0, 1))

d[x=0]: d.__getitem__((), x=0)

d[0, y=1]: d.__getitem__(0, y=1)

d[0, 1, z=2]: d.__getitem__((0, 1), z=2)

That may not be in the PEP, but apart from the edge cases for d[] and d[x=0] it’s exactly what I and Steven have been proposing for quite a while.

--Guido (mobile)

I want to offer a big apology if this question has been answered 1 million times already. That being said, on the edge case:


...what is the alternative proposed __getitem__ call from Guido and Steven?

And what about unpacking?

d[*()]: d.__getitem__(())


d[**{}]:  d.__getitem__(())

Thumb's up, or down on one, both? I can't remember what the current PEP says on these. Both are currently SyntaxErrors.


"I've never met a Kentucky man who wasn't either thinking about going home or actually going home." - Happy Chandler