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

eiee3dmh  于 2023-03-04  发布在  Python
关注(0)|答案(2)|浏览(122)

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

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

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

在本例中,我想知道sound属性是不同的,并且attitude属性仅在cat中。
这种情况的用例是,我试图覆盖库中的一些默认行为,我正在设置一个与库不同的对象,但我不知道是什么。

rvpgvaaj

rvpgvaaj1#

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

结果:

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

对于类集合对象,^是对称差。

qoefvg9y

qoefvg9y2#

您可以查看一下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'}}}

相关问题