9 '''Return all key-value pairs that are different between d1 and d2. |
9 '''Return all key-value pairs that are different between d1 and d2. |
10 |
10 |
11 This includes keys that are present in one dict but not the other, and |
11 This includes keys that are present in one dict but not the other, and |
12 keys whose values are different. The return value is a dict with values |
12 keys whose values are different. The return value is a dict with values |
13 being pairs of values from d1 and d2 respectively, and missing values |
13 being pairs of values from d1 and d2 respectively, and missing values |
14 represented as default.''' |
14 treated as default, so if a value is missing from one dict and the same as |
|
15 default in the other, it will not be returned.''' |
15 res = {} |
16 res = {} |
16 if d1 is d2: |
17 if d1 is d2: |
17 # same dict, so diff is empty |
18 # same dict, so diff is empty |
18 return res |
19 return res |
19 |
20 |
20 for k1, v1 in d1.iteritems(): |
21 for k1, v1 in d1.iteritems(): |
21 if k1 in d2: |
22 v2 = d2.get(k1, default) |
22 v2 = d2[k1] |
23 if v1 != v2: |
23 if v1 != v2: |
24 res[k1] = (v1, v2) |
24 res[k1] = (v1, v2) |
|
25 else: |
|
26 res[k1] = (v1, default) |
|
27 |
25 |
28 for k2 in d2: |
26 for k2 in d2: |
29 if k2 not in d1: |
27 if k2 not in d1: |
30 res[k2] = (default, d2[k2]) |
28 v2 = d2[k2] |
|
29 if v2 != default: |
|
30 res[k2] = (default, v2) |
31 |
31 |
32 return res |
32 return res |
33 |
33 |
34 def join(d1, d2, default=None): |
34 def join(d1, d2, default=None): |
35 '''Return all key-value pairs from both d1 and d2. |
35 '''Return all key-value pairs from both d1 and d2. |