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

2024-04-20 15:56:32 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使用assert语句验证两个值仅为忽略类型的变量?我希望下面的回复是真的

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

Tags: 类型assert语句
2条回答

您可以将两者转换为同一类型并比较它们;即

assert str(s) == str(t)

一般来说,除非类型的__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

相关问题 更多 >