On 2014-02-25 23:10, Steven D'Aprano wrote: > On Tue, 25 Feb 2014 15:03:51 -0600, Tim Chase wrote: > > > On 2014-02-25 14:40, Skip Montanaro wrote: > >> What's the correct result of evaluating this expression? > >> > >> {'A': 1} | {'A': 2} > >> > >> I can see (at least) two possible "correct" answers. > > > > I would propose at least four: > > > > {'A': 1} # choose the LHS > > {'A': 2} # choose the RHS > > {'A': (1,2)} # a resulting pair of both > > Should that value be a tuple, a list or a set?
I'd say a tuple: it has order (thus not a set), and it's a fixed record of (LHS, RHS), not mutable as a list would suggest. > Option 5: raise an exception if the values are different. Inconvenient in many use cases, but certainly another possibility > Option 6: "or" the values, so that the LHS value is used only if it > is truthy, otherwise the RHS value is used. That is: > > {'A': leftdict['A'] or rightdict['A']} > > > I don't really understand the use-case behind Option 6 I can imagine a use case for it, but certainly not the *default* behavior. Yick. > > If dicts were to support set ops, the last one would be my > > preferred result. > > What, getting a set back? > > No, I disagree. If you want a set, it's easy to do: > > dicta.keys() | dictb.keys() > > (In Python 2, use viewkeys instead.) Now that I'm aware of .viewkeys()/.keys() (herein "vk/k" for brevity) thanks to Peter Otten's post, that does what I most commonly want for set-ops-on-dicts. I'd just consider this a promotion, since for k in my_dict: pass is the same as for k in my_dict.keys(): # or .iterkeys() in 2.x pass I'd find it intuitive to have set-ops behave similarly, defaulting to vk/k. > All of these operations are quite simple to write, so personally I > would recommend people just add their own helper function with the > behaviour they prefer. And with vk/k, I now fall pretty firmly in agreement with you (except for the aforementioned possibility of having a dict's currently-unused set-ops use the results of vk/k as well). -tkc -- https://mail.python.org/mailman/listinfo/python-list