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

Python 如何使用assert忽略类型而只比较值,python,pytest,Python,Pytest,如何使用assert语句来验证两个变量的值仅忽略类型?我想下面返回真的 s = 3 t = '3' assert s == t 您可以将两者转换为同一类型并进行比较;i、 e assert str(s) == str(t) 通常,不同类型的值不会进行相等的比较,除非类型的\uuuuu eq\uuu方法为您处理类型转换。str.\uuuuu eq\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

如何使用assert语句来验证两个变量的值仅忽略类型?我想下面返回真的

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

您可以将两者转换为同一类型并进行比较;i、 e

assert str(s) == str(t)

通常,不同类型的值不会进行相等的比较,除非类型的
\uuuuu eq\uuu
方法为您处理类型转换。
str.\uuuuu eq\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。您必须转换一个或另一个参数,以便进行断言工作,并且转换必须保留您心目中的任何平等感

assert str(s) == t
assert s == int(t)
使用正确编写的
\uuuuu eq\uuu
方法的类型可以为您处理此问题。想象一下这样一个名为
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

3和“3”不具有相同的值,因为它们在内存中存储为相同的位序列,即使忽略与类型表示有关的任何位。如果这不是你所说的“值”,你应该澄清你的意思。不必详细讨论位和内存存储,你的
s
t
实际上没有“相同的值”——一个是整数3,另一个是字符“3”。类型实际上是对象值的一部分。在这种情况下,您当然可以将一个或另一个转换为匹配类型,但这不能作为通用解决方案工作,并且没有可能的通用解决方案。不幸的是,这是您将要找到的最接近通用解决方案的东西
float
是一个必须单独处理的变量。@brunodesshuilliers:f1不等同于f2,str(f1)不等同于str(f2);你认为这是个问题吗?@ StgSununter对不起,我的意思是<代码> F2=10/3 < /代码> -但是重做测试导致<代码> STR(F1)等于<代码> STR(F2)< /代码>,所以我必须确实犯了一些错误;