10

我已经子类化int以添加一个额外的属性:

class Integer(int):
    def __new__(cls, value, base=10, indirect=False):
        try:
            obj = int.__new__(cls, value, base)
        except TypeError:
            obj = int.__new__(cls, value)
        return obj

    def __init__(self, value, base=10, indirect=False):
        self.indirect = indirect

在我的应用程序中使用此类,int(Integer(b'0')) 有时会返回值 48 (= ord('0')!) 或 192,而不是正确的值 0。str(Integer(b'0'))总是返回'0'. 这似乎只发生在值 0 上。首先解码b'0'为字符串,或传递int(b'0')Integer没有区别。问题在于将 an 转换Integer(0)intwith int()

此外,这以随机方式发生。随后的运行将在应用程序(解析器)的不同点产生 48 或 192。Python 3.2.2 和 3.2.3 的行为相同(32 位,Windows XP)。

我似乎无法在一个简单的测试程序中重现这一点。以下不产生输出:

for i in range(100000):
    integer = int(Integer(b'0'))
    if integer > 0:
        print(integer)

检查int(Integer()) > 0我的应用程序中的条件(当我知道 is 的参数时Integerb'0'并有条件地打印int(Integer(b'0'))多次,结果 48 和 192 不时出现。

发生什么了?

编辑- 由于我无法在简短的测试程序中重现该问题,因此我在此处提供了相关代码。它基本上是一个 PDF 解析器。此 PDF 文件的输出产生,例如:

b'0' 0 Integer(0) 192 0 b'0' 16853712
b'0' 0 Integer(0) 48 0 b'0' 16938088
b'0' 0 Integer(0) 192 0 b'0' 17421696
b'0' 0 Integer(0) 48 0 b'0' 23144888
b'0' 0 Integer(0) 48 0 b'0' 23185408
b'0' 0 Integer(0) 48 0 b'0' 23323272

在代码中搜索 print 函数调用,看看它代表什么。

4

0 回答 0