On Mon, Aug 3, 2020 at 5:23 PM Todd <toddr...@gmail.com> wrote:

> Another approach could be too simply pass the labelled indices in a dict
> as a third/fourth positional argument.
>
> So for indexing
>
> b = arr[1, 2, a=3, b=4]
>
> Instead of
>
> __getitem__(self, (1, 2), a=3, b=4)
>
> Just do
>
> __getitem__(self, (1, 2), {'a': 3, 'b': 4})
>

Steven D's reply to me in the previous thread explains why this isn't a
great approach; I'll copy and paste the relevant section.

Summary: having to "break up" the positional dictionary is painful, for not
much of a benefit.

His comment was actually more specific to Jonathan Fine's key object idea,
but it applies just as much to this API suggestion, I think.

Go through the exercise. I have -- I've written Python 2 code that
>
needed to handle-keyword only arguments, and this was the only way to do
> so.
>
> The "only one parameter, which may receive a keyobject" design will
> have us writing code something like this:
>
>
>     # I want this: def __getitem__(self, item, * a, b, c, d=0)
>     # but have to write this:
>
>     def def __getitem__(self, item):
>         # Determine whether we got any keyword arguments.
>         if isinstance(item, keyobject):
>             keys = item
>             item = ()
>
>         elif isinstance(item, tuple):
>             # Assuming that all keyword args are at the end;
>             # if there could be more than one keyobject, or if
>             # they could be anywhere in the tuple, this becomes
>             # even more complex. I don't even want to think
>             # about that case.
>             if item and isinstance(item[-1], keyobject):
>                 keys = item[-1]
>                 item = item[:-1]
>
>         else:
>             keys = keyobject()
>
>         # Now extract the parameters from the key object.
>         if 'a' in keys:
>             a = keys.pop('a')
>         else:
>             raise TypeError('missing keyword argument "a"')
>         # same for b and c
>
>         d = keys.pop('d', 0)
>         # Check for unexpected keywords.
>         if keys:
>             raise TypeError('unexpected keyword')
>
>
> (Any bugs in the above are not intentional.) And now finally we can
> actually use the keyword parameters and write the method.
>

However I'll also point out that another idea from Jonathan Fine has the
potential to fix both this problem and the key object signature problem,
which is what he called a "SIGNATURE CHANGING ADAPTER".


> Here's how it goes. First we write
>     class D:
>         @wibble
>         def __setitem__(self, val, u, v, x, y):
>             pass  # Or do something.
>
> Next, we define wibble. It will be a SIGNATURE CHANGING ADAPTER.  Those
> who know how to make decorators will, I hope, have little difficulty in
> defining wibble to do what is required. For this exercise, assume that
> k.argv = (1, 2), and k.kwargs = dict(x=3, y=4).
>
>


---
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/HRYXHSV66C5YVKGL7YFUHEN74DB7DXCP/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to