On Wed, Aug 26, 2020 at 12:38 PM Alex Hall <alex.moj...@gmail.com> wrote:

>
> This is why we have ABCs in the first place (and static checking). So that
> you can't add it to Sequence is already a smell. If it's in the Mapping
> protocol, why isn't it in the Sequence protocol?
>
> This is all just a general feature of ABCs. They were written once and
> frozen in place and no new methods can be added to them because it would
> break compatibility. It's not specific to this proposal. | and |= operators
> were added to dict but not to Mapping/MutableMapping for the same reason,
> even though the same operators exist with a similar meaning in the
> Set/MutableSet protocols. So there's a clear precedent for this.
>

and the Set ABC doesn't have the set methods, like .union, .intersection
... (though I still don't get why that is ...)

>
> It's a little unfortunate that we can't put this in the Sequence ABC, but
> it's not a big deal. The vast majority of the time I'm interfacing with my
> own code and so I know that I'm working with a list, not some mysterious
> Sequence. I don't think people are going to change their public facing
> function signatures from `def foo(x: Sequence)` to `(x: list)` just so that
> they can use `x.get`. Even if they do, it suggests that they think `.get`
> is really useful, and callers can just convert their argument to a list
> first. Similarly adding the union operator to dict is fine because people
> usually use dicts, not generic Mappings.
>

This is something to be thinking about, however -- having the builtins
extend the ABCs hasn't been a big deal, what with dynamic typing and all --
but as folks start using type hints, and static type checking more, it
could be an issue.

Honestly, I haven't delved into type checking much, so maybe I'm making
this up, but what if you write a function that is type hinted to take a
Mapping, and uses | or |=, and all the test code uses a built in dict, and
all seems to be well.

Then this code starts being more widely used, and someone runs it with a
different Mapping object, and it passes the static type checking pass, and
then, oops, a run-time failure.

It makes me wonder of the utility of the ABCs is the builtins are extending
them.

Maybe we need a set of (at least for testing) builtins that are fully ABC
conformant ?

-CHB










>
> Besides, list already defines a bunch of stuff not found in Sequence or
> MutableSequence: copy, sort, `<`, `+`, and `*`. What's one more?
>
>
>> There's also the slippery-slope argument brought up earlier -- should it
>> be added to tuple? To range?
>>
>
> I think Steven D'Aprano asked this. I don't see it as an argument against
> or a concern about a slippery slope, just a question. I think it'd be nice
> to have it on lots of sequences, but it's OK if it's not. Neither scenario
> strikes me as problematic.
>
> The union operator was also added to defaultdict, OrderedDict, and
> ChainMap. Was this a problem?
>
>
>> What should it do for a negative index?
>>
>
> I think most people expect that if `lst[i]` returns a value then
> `lst.get(i)` should return the same value, therefore it should return a
> default only when `lst[i]` fails. Sometimes you specifically want
> `lst.get(-1)` - there's a couple examples of that in [my earlier post](
> https://mail.python.org/archives/list/python-ideas@python.org/message/7W74OCYU5WTYFNTKW7PHONUCD3U2S3OO/)
> and Daniel recently presented a case when he wanted that.
>
> This isn't the ideal behaviour for all use cases, but only as much as
> normal indexing isn't the ideal behaviour for all use cases. Sometimes I've
> had bugs because I forgot to account for negative indices, but I'm still
> very grateful to you that negative indices work. We can't make something
> equally convenient for all use cases, but that doesn't diminish the value
> of this method.
>
> You said yourself that the generic alternative for all sequences is to
> "check for IndexError", a sign that doing the equivalent of that is more
> intuitive.
>
>
>> I also think it negatively affects readability. Today when I see
>> `foo.get(bar)` I assume that (unless the code is full of tricks) foo is a
>> dict or Mapping
>>
>
> That's already a poor assumption to make. `get` is an extremely generic
> method name that has lots of meanings in different classes.
>
>
>> But if list also grows a .get() method I have to assume in my head that
>> foo is a list and then bar an int, and I basically have to read the rest of
>> the code twice, once assuming foo is a Mapping, and once assuming it's a
>> list.
>>
>
> The purpose of `foo.get(bar)` is to get a value, not to tell you that foo
> is a dict. If the rest of the code isn't able to tell you whether `foo` is
> a dict or a list, then either the code is poorly written (and .get is not
> to blame) or it doesn't matter because you're just getting individual
> values. `foo[bar]` doesn't differentiate between lists and dicts and this
> is generally considered a good thing, not a problem.
>
>
>> The generalization I am talking about here is the assumption that because
>> list and dict both support x[y], and dict also has x.get(y) which returns a
>> default instead of raising, then it would be a good idea to add the latter
>> also to list.
>>
>
> I'm not assuming that list should have .get because dict has it. I'm
> claiming list should have it because it would often be useful, based on
> [empirical evidence](
> https://mail.python.org/archives/list/python-ideas@python.org/message/7W74OCYU5WTYFNTKW7PHONUCD3U2S3OO/
> ).
>
> Anyway, thank you for this. I'm enjoying the discussion and I'm glad to
> hear actual reasons that can be argued about rather than the proposal just
> fizzling away.
> _______________________________________________
> 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/K2PMSIJQ27TS2JJUKPV3ASLJJ4HTVTBP/
> 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/WRL2JABUYQUKLZ4DHD45K4CMZU64EDNE/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to