int子类的非确定性行为

时间:2012-04-19 14:44:21

标签: python python-3.x int subclass built-in

我已经将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. {{1总是返回str(Integer(b'0'))。这似乎只发生在值0.首先将'0'解码为字符串,或将b'0'传递给int(b'0')没有任何区别。问题在于将Integer转换为Integer(0)int

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

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

int()

检查我的应用程序中的条件for i in range(100000): integer = int(Integer(b'0')) if integer > 0: print(integer) (当我知道int(Integer()) > 0的参数为Integer时)并有条件地打印b'0'多次,结果48 192现在偶尔出现。

那么,发生了什么?

编辑 - 由于我无法在短测试程序中重现该问题,因此我已将相关代码设为here。它基本上是一个PDF解析器。 this PDF file的输出产生,例如:

int(Integer(b'0'))

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

0 个答案:

没有答案