int子类的非确定性行为

Bre*_*els 10 python int subclass built-in python-3.x

我有子类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
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中使用此类,int(Integer(b'0')) 有时返回值48(= ord('0')!)或192,而不是正确的值0. str(Integer(b'0'))总是返回'0'.这似乎只发生在值0.首先解码b'0'为字符串,或传递int(b'0')Integer没有区别.问题在于将a转换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)
Run Code Online (Sandbox Code Playgroud)

检查int(Integer()) > 0我的应用程序中的条件(当我知道参数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
Run Code Online (Sandbox Code Playgroud)

在代码中搜索打印函数调用以查看它代表什么.