I’m not at all sure this Idea is possible,

But even if so, there’s a real trick here.  The [] operator is not a
function call, it is a special operator that “takes” a single expression.

Thing[a, b] is not “getting” two objects, it is getting a single tuple,
which is created by the comma. That is, expression:

a,b

Has the same value as:

(a, b)

Or

tuple(a,b)

Which means:

t = tuple(a, b)
thing[a, b]

Is exactly the same as

thing[a,b]

And that equivalency needs to be maintained.

In practice, two common use cases treat the resulting tuple essentially
semantically differently:

1) Using tuples as dict keys i.e. a single value that happens to be a tuple
is a common practice.

2) numpy uses the elements of a tuple as separate indices.

I don’t think the interpreter would have any way to know which of these is
intended.

-CHB



On Mon, Aug 24, 2020 at 10:12 AM Ricky Teachey <ri...@teachey.org> wrote:

> Here is another way forward-- inspired by a conversation off-list with
> Jonathan Fine. I am calling it  "signature dependent semantics".
>
>
>
>
> Right now, the semantic meaning of a __setitem__ function like this:
>
> # using ambiguous names for the parameters on purpose
> def __setitem__ (self, a, b): ...
>
> ...is currently as follows:
> *Note: below the === is not supposed to be code - I am using it as a way
> to state the semantics on the RHS of the signature on the LHS.*
>
> SIGNATURE === SEMANTICS
> (self, a, b) === (self, key_tuple, value)
>
> In the above, a on the left side, semantically, is the key tuple, and b in
> the value on the RHS.
>
> So right now, line 1 below calls line 2:
>
> [1]: d[1, 2] = foo
> [2]: d.__setitem__(key_tuple, value)
>
> And the call occurs this way:
>
> d.__setitem__((1,2), foo)
>
> So far, all of this is just a description of what currently happens.
>
> The
>
>
>
> signature dependent semantics
>
>
>
> proposal is NOT to change the semantic meaning of the above code in any
> way. These semantics would be maintained.
>
> Signature dependent semantics, as the name suggests, would change the
> semantic meaning of the __setitem__ signature in the case that more than
> two parameters are given in the signature.
>
> In other words, if a signature is provided like this, with 3 or more
> arguments:
>
> def: __setitem__(self, a, b, c): ...
>
> ...then in that case, the language would know there is a different
> semantic meaning intended.
>
> Right now, the above signature would raise a TypeError:
>
> >>> class D:
> ...     def __setitem__(self, a, b, c):
> ...       ...
> ...
> >>> d=D()
> >>> d[1,2] = object()
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> TypeError: __setitem__() missing 1 required positional argument: 'c'
>
> However, using signature dependent semantics, the language would know to
> call using semantics like this instead of raising a TypeError:
>
> d.__setitem__(foo, 1, 2)  # value is first positional argument
>
> In other words, in the case that there are three or more arguments present
> in the __getitem__ signature, the semantics of the signature CHANGES:
>
> SIGNATURE === CURRENT SEMANTICS: where key_tuple on the RHS contains
> (a,b), and value on the RHS is just c
> (self, a, b, c) === (self, key_tuple, value, CURRENTLY_UNUSED_PARAMETER)
>
> SIGNATURE === NEW SEMANTICS: a is value, b is positional argument 1, c is
> positional argument 2
> (self, a, b, c) === (self, value, pos1, pos2)
>
> I'm no cpython expert, but I think signature dependent semantics for
> __setitem__, as well as for __getitem__ and __delitem__, could be
> implemented.
>
> And that change alone could be made INDEPENDENT of supporting kwd args, or
> KeyObjects, or anything else.
>
> Furthermore, after
>
>
>
> signature dependent semantics were implemented (or perhaps at the same
> time), semantics could easily be extended so that code like this:
>
>   d[1, b=2] = foo
>
> ...on a an object with a __setitem__ signature like this:
>
> def __setitem__(self, value, a, b): ...
>
> ...gets called like this:
>
> d.__setitem__(foo, 1, b=2)
>
> BUT, it could also be implemented such that if that same item setting code
> were made against a signature like this:
>
> def __setitem__(self, a, value): ...
>
> You would get a TypeError, because the semantic meaning of the signature
> with just two positional arguments, key_tuple and value, does not support
> kwd arguments.
>
> DOWNSIDE
>
> The biggest downside to this that I see is that it would be confusing to
> the uninitiated, especially in the following case.
>
> If the  signature dependent semantics proposal were to go forward, and one
> wrote a signature with two arguments, the following semantic meaning could
> be mistakenly expected:
>
> # mistaken perception of __setitem__ method semantics
> SIGNATURE === MISTAKEN SEMANTICS
> (self, a, b) === (self, value, atomic_key)
>
> The mistaken belief above stated outright is that the RHS atomic_key is
> NOT a tuple, it is just b from the LHS. But this would not be correct.
>
> The actual semantics, in order to maintain backward compatibility, would
> not change from what is currently true:
>
> # backward compatible semantics
> SIGNATURE === CORRECT, CURRENT SEMANTICS
> (self, a, b) === (self, key_tuple, value)
>
> The correct understanding illustrated above is that the RHS
>
>
>
> key_tuple
>
>
>
> is a tuple (containing b from the LHS)  of the form (b,).
>
> That seems like potentially a big downside. But maybe not? I don't know.
>
> ---
> Ricky.
>
> "I've never met a Kentucky man who wasn't either thinking about going home
> or actually going home." - Happy Chandler
>
>
>
>
> _______________________________________________
>
> 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/LBLS5OUXSICNKV6ZGDFTBGJNK2YWKNTD/
>
> Code of Conduct: http://python.org/psf/codeofconduct/
>
> --
Christopher Barker, PhD

Python Language Consulting
  - Teaching
  - Scientific Software Development
  - Desktop GUI and Web Development
  - wxPython, numpy, scipy, Cython
_______________________________________________
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/WEFN7JB2SOUQ5WEFANBMRKQVWCZV777N/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to