比较两个容器以确定其内容的身份

时间:2010-12-12 23:25:49

标签: python containers identity

我有一个返回一组对象的方法,我正在为这个方法编写一个单元测试。是否有一种通用,整洁和惯用的方式来比较这些身份(而不是平等)?或者我是否需要自己编写合适的实现?

一个例子(有点人为设法保持简单):

class Foo(object):
    def has_some_property(self):
        ...

class Container(object):
    def __init__(self):
        self.foo_set = set()

    def add_foo(self, foo):
        self.foo_set.add(foo)

    def foo_objects_that_have_property(self):
        return set([foo for foo in self.foo_set if foo.has_some_property()])

import unittest

class TestCase(unittest.TestCase):
    def testFoo(self):
        c = Container()
        x, y, z = Foo(), Foo(), Foo()
        ...
        self.assertContentIdentity(c.foo_objects_that_have_property(), set([x, y]))

重要的是,在此处测试是否相等是不行的,因为对foo_objects_that_have_property()返回的对象进行变更可能会导致结果不一致,具体取决于这些对象在Container中的使用方式不同,即使它们“相等” “在测试时。

3 个答案:

答案 0 :(得分:0)

我能想到的最好的是:

@staticmethod
def set_id(c):
    return set([id(e) for e in c])

def assertContentIdentity(self, a, b):
    self.assertEqual(set_id(a), set_id(b))

但是,这是专门用于集合的,不能处理嵌套容器。

答案 1 :(得分:0)

一种简单但尽管不是最有效的方法:

def assertContentIdentity(set1, set2):
    set1 = set([id(a) for a in set1])
    set2 = set([id(a) for a in set2])
    assert set1 == set2

答案 2 :(得分:0)

  从那以后,

x就不会在这里工作了   会告诉我套装是   不同,我已经知道了。一世   想知道他们是否有对象   包含相同的对象或   不同的对象。

然后你需要编写自己的函数,比如

set([id(x) for x in X]) == set([id(y) for y in Y])