On 01.09.20 17:44, Steven D'Aprano wrote:
(9) Keyword-only subscripts are permitted:
obj[spam=1, eggs=2]
# calls type(obj).__getitem__(spam=1, eggs=2)
del obj[spam=1, eggs=2]
# calls type(obj).__delitem__(spam=1, eggs=2)
but note that the setter is awkward since the signature requires the
first parameter:
obj[spam=1, eggs=2] = value
# wants to call type(obj).__setitem__(???, value, spam=1, eggs=2)
Proposed solution: this is a runtime error unless the setitem method
gives the first parameter a default, e.g.:
def __setitem__(self, index=None, value=None, **kwargs)
Note that the second parameter will always be present, nevertheless, to
satisfy the interpreter, it too will require a default value.
(Editorial comment: this is undoubtably an awkward and ugly corner case,
but I am reluctant to prohibit keyword-only assignment.)
Why does the signature require the first `index` parameter? When I see
`obj[spam=1, eggs=2] = value` there's no positional index and so I
wouldn't expect one to be passed. Similar to how the following works:
>>> def foo():
... pass
...
>>> foo(*())
If there's nothing to unpack nothing will be assigned to any of the
parameters.
So the following signature would work with keyword-only subscripts:
def __setitem__(self, value, **kwargs):
I don't how the `[] =` operator is translated to `__setitem__` at the
implementation level, so perhaps the no-positional-index case would
require yet another opcode, but thinking of it in the following way it
would definitely be possible:
obj.__setitem__(*(pos_index + (value,)), **kwargs)
where `pos_index` is the positional index collected from the `[]`
operator as a tuple (and if no such index is given it defaults to the
empty tuple). This matches the above no-index signature of
`__setitem__`. This is also the signature of the corresponding
`__getitem__` and `__delitem__` methods.
_______________________________________________
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/DDNIG6AWODEMEU22IG4BKLXLXX26YZL4/
Code of Conduct: http://python.org/psf/codeofconduct/