У меня есть subclassed 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
не имеет значения. Проблема заключается в преобразовании a Integer(0)
в int
с 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
в моем приложении (когда я знаю, что аргумент Integer
равен b'0'
) и условно печатает int(Integer(b'0'))
несколько раз, результаты 48 и 192 появляются сейчас, а затем.
Итак, что происходит?
EDIT. Поскольку я не могу воспроизвести проблему в короткой тестовой программе, я сделал доступный код здесь. Это в основном анализатор 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
Поиск вызовов функций печати в коде, чтобы увидеть, что это представляет.