
On Thu, Feb 6, 2020 at 3:47 AM Brandt Bucher <brandtbucher@gmail.com> wrote:
I have one suggestion: Wouldn't it be useful for these operators to also accept sets (functionally acting like a dict with None for all values)?
Why None? Why not 0, or False, or 42? This sort of thing belongs more in a function or method, IMHO.
Well, in their defense, None is the null object in Python, so it would be a natural choice. With that said, I am strongly against this for several reasons:
- The proposal in its current form is very easy to wrap your head around: "|" takes dicts, "|=" takes anything dict.update does. - Python doesn't allow sets to be dictionaries anywhere else. It's much more natural to use a dict like a set than to use a set like a dict. Hence, this PEP! - A consistent argument that we've gotten since the very beginning is something to the effect of "I don't know what types are being used in the expression 'a | b'." While we argue that this isn't the issue in practice that people make it out to be, accepting sets here would definitely muddy the waters.
- and you can use dict.fromkeys to "upgrade" a set to a dict anyway. If this goes through as is, and then in a few years' time we start seeing lots of people begging to be able to skip the explicit fromkeys and accept sets directly, it can be addressed then. Personally, I think sets make good sense on the right hand side of an intersection (as a means of saying "whitelist the keys to this set"; values would be irrelevant there anyway), but not with union/update. ChrisA