我已经将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'))
在代码中搜索打印函数调用,以查看它代表什么。