On 2/09/20 3:44 am, 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)
An alternative is to pass an empty tuple as the index when there are no positional args. That would make the following less of a special case:
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)
Gotchas
def __getitem__(self, index, direction='north')
if the caller uses this:
obj[0, 'south']
they will probably be surprised by the method call:
obj.__getitem__((0, 'south'), direction='north')
Solution: best practice suggests that keyword subscripts should be flagged as keyword-only when possible:
def __getitem__(self, index, *, direction='north')
Note that this will only help if the user looks at and takes careful notice of the signature of the __getitem__ method -- it won't actually prevent them from attempting to do obj[0, 'south'] and won't affect the result if they do.
A better best practice would be to use a decorator such as the one I posted earlier to convert the packed positional args into real ones. Then they will get the expected result in most cases.