如何使用assert忽略类型但只比较值

时间:2018-03-30 14:04:49

标签: python pytest

如何使用assert语句验证两个值只是为了忽略类型?我想跟随返回True

s = 3
t = '3'
assert s == t

2 个答案:

答案 0 :(得分:1)

您可以将两者转换为相同的类型并进行比较;即。

assert str(s) == str(t)

答案 1 :(得分:1)

通常,除非类型的__eq__方法为您处理类型转换,否则不同类型的值不会相等。 str.__eq__int.__eq__都不这样做,因此'3' == 33 == '3'都会评估为False。你必须转换一个或另一个参数才能使你的断言工作,并且转换必须保留你想到的任何平等感。

assert str(s) == t
assert s == int(t)

具有正确编写的__eq__方法的类型可以为您处理此问题。想象一下这样一个名为IntorStr的类;然后所有以下内容都会通过:

for x,y in itertools.product([3, '3'], repeat=2):
    assert IntOrStr(x) == y
    assert x == IntOrStr(y)
    assert IntOrStr(x) == IntOrStr(y)

IntOrStr可能看起来像

class IntOrStr:
    def __init__(self, v):
        self.v = v
        self.type = type(v)

    def __eq__(self, other):
        if self.v == other:
            return True
        try:
            v = self.type(other)
        else:
            if self.v == v:
                return True

        try:
            v = other.v
        else:
            return self.v == v or self.v == self.type(v)

        return False