On Apr 16, 2020, at 07:19, Soni L. <fakedme...@gmail.com> wrote:
> 
>  what about a dict.setdefaults (note the s) that takes in an iterable or a 
> dict, and uses insert-or-ignore behaviour? (unfortunately a lot of iterables 
> and all generators are hashable, and we can't break that.)
> 
> I could really use something like that tbh.

Then tell us the use cases that you have in mind.

I can think of lots of common uses for “override this dict with that one”, such 
as the typical “defaults, config file, environment, argv” thing that most 
command line tools do. But I can already write that, in idiomatic and readable 
code (and in fact with variations—update, |, or ChainMap); why would I want to 
be able to write the same thing in another way that’s conceptually backward, 
probably less efficient, and doesn’t work in Python 3.8? If the issue is just 
that you have those default values in a list of pairs rather than a dict, it’s 
trivial to just construct a dict from that.

Maybe there are good use cases where the usual way would feel backward or wrong 
and setdefaults would be nicer. But if so, you need to show some.

And they have to be pretty common. You can obviously already write that as `for 
k, v in defaults: d.setdefault(k, v)`, which is acceptable if it comes up once 
a year, but demands improvement if people are (or should be, if they only 
realized it) writing it all over the place.

(If the API were obviously symmetrical, the bar might be a lot lower. See the 
Haskell dict update operators—I’ll bet I’ve often used the “backward” ones and 
not even realized it, because they don’t look backward or unusual, and because 
Haskell in general encourages that kind of symmetrical thinking everywhere, to 
the extent that even “pass this arg to that  function” is almost as commonplace 
as “call this function with that arg”. But I don’t think Python could get there 
from here, even if it were a good idea.)

More generally, it seems like you think Python needs to include everything 
anyone can think of that might theoretically be useful somewhere. But it’s 
designed to only include (almost) everything people need regularly and can’t 
just trivially and build for themselves, because aiming for that sweet spot 
keeps Python discoverable and Python code readable—and similarly for Rust, 
Swift, Ruby, and other languages that attempt to go that way, even if none of 
them (including Python) pulls it off perfectly. A kitchen sink language is even 
worse than a no-batteries-included language—it isn’t just harder to design and 
implement, it’s harder to use. You have more docs to wade through to find 
anything, more subtle distinctions to think through to decide, more stuff to 
remember when you come back to the language after time spent doing other stuff, 
more trouble reading code written by other people who internalized a different 
subset of the kitchen sink, etc.
_______________________________________________
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/LIEVKGZHN3PD5DGDQIZTE6TWRTCL6KIK/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to