我想拿两本字典并打印出它们的差异.此差异应包括键和值的差异.我已经创建了这个小片段,以使用unittest模块中的内置代码实现结果.然而,这是一个讨厌的黑客,因为我必须子类unittest.TestCase并提供一种runtest()方法来工作.此外,此代码将导致应用程序出错,因为它会AssertError在存在差异时引发.我真正想要的就是打印差异.
import unittest
class tmp(unittest.TestCase):
def __init__(self):
# Show full diff of objects (dicts could be HUGE and output truncated)
self.maxDiff = None
def runTest():
pass
_ = tmp()
_.assertDictEqual(d1, d2)
Run Code Online (Sandbox Code Playgroud)
我希望使用该difflib模块,但它看起来只适用于字符串.有没有办法解决这个问题并仍在使用difflib?
从cpython来源改编而成:
import difflib
import pprint
def compare_dicts(d1, d2):
return ('\n' + '\n'.join(difflib.ndiff(
pprint.pformat(d1).splitlines(),
pprint.pformat(d2).splitlines())))
Run Code Online (Sandbox Code Playgroud)
您可以使用 difflib,但使用 unittest 方法对我来说似乎更合适。但如果你想使用 difflib。假设以下是两个命令。
In [50]: dict1
Out[50]: {1: True, 2: False}
In [51]: dict2
Out[51]: {1: False, 2: True}
Run Code Online (Sandbox Code Playgroud)
您可能需要将它们转换为字符串(或字符串列表),然后继续使用 difflib 作为正常业务。
In [43]: a = '\n'.join(['%s:%s' % (key, value) for (key, value) in sorted(dict1.items())])
In [44]: b = '\n'.join(['%s:%s' % (key, value) for (key, value) in sorted(dict2.items())])
In [45]: print a
1:True
2:False
In [46]: print b
1:False
2:True
In [47]: for diffs in difflib.unified_diff(a.splitlines(), b.splitlines(), fromfile='dict1', tofile='dict2'):
print diffs
Run Code Online (Sandbox Code Playgroud)
输出将是:
--- dict1
+++ dict2
@@ -1,2 +1,2 @@
-1:True
-2:False
+1:False
+2:True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5360 次 |
| 最近记录: |