找出两个Python对象之间的差异

17

在Python中有没有一种方法可以找到两个相同类型的对象之间或任意类型的对象之间的差异?所谓的差异是指它们的属性值不同,或者一个对象具有另一个对象没有的属性。例如:

dog.kingdom = 'mammal'
dog.sound = 'bark'

cat.kingdom = 'mammal'
cat.sound = 'meow'
cat.attitude = 'bow to me'
在这个例子中,我想知道sound属性是不同的,而attitude属性仅在cat中存在。
这个用例是因为我正在尝试覆盖库中的一些默认行为,并且我正在设置一个与库不同的对象,但我不知道具体是什么对象。

2
deepdiff - yuri kilochek
2个回答

34
print(dog.__dict__.items() ^ cat.__dict__.items())

结果:

{('attitude', 'bow to me'), ('sound', 'meow'), ('sound', 'bark')}

对于类似集合的对象,^ 代表对称差。


请参见文档以获取更多“集合操作”(https://docs.python.org/3/library/stdtypes.html#set)。 - djvg
2
请注意,为了使此功能正常工作,所有属性都必须是可哈希的。 - djvg

1
你可以看一下DeepDiff
在相同类的两个实例之间:
from deepdiff import DeepDiff
from pprint import pprint

class Animal:
    pass

dog = Animal()
cat = Animal()

dog.kingdom = 'mammal'
dog.sound = 'bark'

cat.kingdom = 'mammal'
cat.sound = 'meow'
cat.attitude = 'bow to me'

differences = DeepDiff(dog, cat)
pprint(differences)
>> {'attribute_added': [root.attitude],
>>  'values_changed': {'root.sound': {'new_value': 'meow', 'old_value': 'bark'}}}

在两个不同类的实例之间:

from deepdiff import DeepDiff
from pprint import pprint

class Dog:
    pass

class Cat:
    pass

dog = Dog()
cat = Cat()


dog.kingdom = 'mammal'
dog.sound = 'bark'

cat.kingdom = 'mammal'
cat.sound = 'meow'
cat.attitude = 'bow to me'

differences = DeepDiff(dog, cat, ignore_type_in_groups=(Dog, Cat))
pprint(differences)
>> {'attribute_added': [root.attitude],
>>  'values_changed': {'root.sound': {'new_value': 'meow', 'old_value': 'bark'}}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接