On Fri, Aug 7, 2020 at 6:29 PM Stephan Hoyer <sho...@gmail.com> wrote:

> On Fri, Aug 7, 2020 at 9:12 AM Ricky Teachey <ri...@teachey.org> wrote:
>
>> On Fri, Aug 7, 2020 at 4:19 AM Steven D'Aprano <st...@pearwood.info>
>> wrote:
>>
>>> On Fri, Aug 07, 2020 at 05:54:18PM +1000, Steven D'Aprano wrote:
>>>
>>> > This proposal doesn't say anything about reversing the decision made
>>> all
>>> > those years ago to bundle all positional arguments in a subscript into
>>> a
>>> > single positional parameter. What's done is done, that's not going to
>>> > change.
>>>
>>> Sorry, I was referring to the proposal that inspired this thread, to add
>>> keyword arguments to subscripting. There's an actual concrete use-case
>>> for adding this, specifically for typing annotations, and I cannot help
>>> but feel that this thread is derailing the conversation to something
>>> that has not been requested by anyone actually affected by it.
>>>
>>
>> Well I wonder if they haven't asked because it would be such a huge
>> change, and it seems unlikely to happen. But I surely don't know enough
>> about the implementation details of these libraries to be able to say for
>> certain one way or the other.
>>
>
> NumPy and pandas both care a lot about backwards compatibility, and don't
> like churn for the sake of churn.
>
> Speaking as someone who has been contributing to these libraries for
> years, the present syntax for positional arguments in __getitem__ is not a
> big deal, and certainly isn't worth breaking backwards compatibility over.
>
> In practice, this is worked around with a simple normalization step, e.g.,
> something like:
>
> def __getitem__(self, key):
>     if not isinstance(key, tuple):
>         key = (key,)
>     # normal __getitem__ method
>
> This precludes incompatible definitions for x[(1, 2)] and x[1, 2], but
> really, nobody this minor inconsistency is not a big deal. It is easy to
> write x[(1, 2), :] if you want to indicate a tuple for indexing along the
> first axis of an array.
>
> From my perspective, the other reasonable way to add keyword arguments to
> indexing would be in a completely backwards compatible with **kwargs.
>

I'm sorry, I did a poor job of editing this.

To fill in my missing word: From my perspective, the *only* reasonable way
to add keyword arguments to indexing would be in a completely backwards
compatible way with **kwargs.



>
>> I may have allowed my frustration to run ahead of me, sorry.
>>>
>>> There is a tonne of code that relies on subscripting positional
>>> arguments to be bundled into a single parameter. Even if we agreed that
>>> this was suboptimal, and I don't because I don't know the rationale for
>>> doing it in the first place, I would be very surprised if the Steering
>>> Council gave the go-ahead to a major disruption and complication to the
>>> language just for the sake of making subscript dunders like other
>>> functions.
>>
>>
>>> Things would be different if, say, numpy or pandas or other heavy users
>>> of subscripting said "we want the short term churn and pain for long
>>> term benefit".
>>>
>>> But unless that happens, I feel this is just a case of piggy-backing a
>>> large, disruptive change of minimal benefit onto a a small, focused
>>> change, which tends to ruin the chances of the small change. So please
>>> excuse my frustration, I will try to be less grumpy about it.
>>>
>>
>> I understand the grumpiness given your explanation. I'm really not
>> wanting to derail that kwd args proposal-- I really like it, whatever the
>> semantics of it turn out to be.
>>
>> I was actually trying to help the kwd arg case here. As illustrated by
>> the quote I included from Greg Ewing, there seems to be not even close to a
>> consensus over what the semantic meaning of this should be:
>>
>> m[1, 2, a=3, b=2]
>>
>> Which could be made to mean one of the following things, or another thing
>> I haven't considered:
>>
>> 1.    m.__get__((1, 2), a=3, b=4)  # handling of positional arguments
>> unchanged from current behavior
>> 2.    m.__get__(1, 2, a=3, b=4)  # change positional argument handling
>> from current behavior
>> 3.    m.__get__((1, 2), {'a': 3, 'b': 4})  #  handling of positional
>> arguments unchanged from current behavior
>> 4.    m.__get__(KeyObject( (1, 2), {'a': 3, 'b': 4} ))   # change
>> positional argument handling from current behavior only in the case that
>> kwd args are provided
>>
>> As Greg said:
>>
>> These methods are already kind of screwy in that they don't
>>> handle *positional* arguments in the usual way -- packing them
>>> into a tuple instead of passing them as individual arguments.
>>> I think this is messing up everyone's intuition on how indexing
>>> should be extended to incorporate keyword args, or even whether
>>> this should be done at all.
>>
>>
>> To illustrate the comments of "kind of screwy" and "the usual way", using
>> semantic meaning # 1 above, then these are totally equivalent * :
>>
>> m[1, 2, a=3, b=4]
>> m[(1, 2), a=3, b=4]
>>
>> ...even though these are totally different:
>>
>> f(1, 2, a=3, b=4)
>> f((1, 2), a=3, b=4)
>>
>> So my intention here isn't to derail, but to help the kwd argument
>> proposal along by solving this screwiness problem.
>>
>> It is to suggest that maybe a way forward-- to make the intuition of the
>> semantics of kwd args to [ ] much more obvious-- would be to change the
>> signature so that this incongruity between what happens with "normal"
>> method calls and the "call" for item-get/set/del can be smoothed out.
>>
>> If that incongruity were to be fixed, it seems to me it would become
>> *obvious* that the semantic meaning of ` m[1, 2, a=3, b=2]` should
>> definitely be:
>>
>> m.__get__(1, 2, a=3, b=4)
>>
>> But if all of this is not helping but hindering. I am happy to withdraw
>> the idea.
>>
>> * Citing my source: I borrowed these examples from Jonathan Fine's
>> message in the other thread
>>
>>
>> ---
>> 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/BJOW5FVCNKNBWKMGAOIR2NYH6HKG4ONK/
>> Code of Conduct: http://python.org/psf/codeofconduct/
>>
>
_______________________________________________
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/LPVT6TZY3GJQ32B6EAWF2VVIFRZRQADR/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to