Skip to content

Instantly share code, notes, and snippets.

@nicolashahn
Created December 8, 2019 22:22
Show Gist options
  • Save nicolashahn/4e83b4c28137cf6cc4e1d7e9c8003b64 to your computer and use it in GitHub Desktop.
Save nicolashahn/4e83b4c28137cf6cc4e1d7e9c8003b64 to your computer and use it in GitHub Desktop.
class NotIn:
def __repr__(self):
return "<not in dict>"
NOT_IN = NotIn()
def ddiff(A, B):
""" Create a dict that shows the difference between two dicts. """
D = {}
allkeys = set(A.keys() + B.keys())
for k in allkeys:
av, bv = A.get(k, NOT_IN), B.get(k, NOT_IN)
if av != bv:
D[k] = (av, bv)
return D
def pprint_diff(A, B):
""" Show the diff between two dict. """
D = ddiff(A, B)
added = {}
removed = {}
changed = {}
for k, (av, bv) in D.items():
if av == NOT_IN:
added[k] = bv
elif bv == NOT_IN:
removed[k] = av
else:
changed[k] = (av, bv)
print("{")
for k in set(A.keys() + B.keys()):
if k in added:
print(" + {}: {},".format(k, added[k]))
elif k in removed:
print(" - {}: {},".format(k, removed[k]))
elif k in changed:
print(" ~ {}: {} -> {},".format(k, changed[k][0], changed[k][1]))
else:
print(" {}: {},".format(k, A[k]))
print("}")
def main():
A = dict(a=1, b=2, c=3)
B = dict(a=1, b=3, d=4, e=None)
D = ddiff(A, B)
assert D == dict(b=(2, 3), c=(3, NOT_IN), d=(NOT_IN, 4), e=(NOT_IN, None))
pprint_diff(A, B)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment