我已经子类化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)
为int
with 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 的参数时Integer
)b'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 函数调用,看看它代表什么。