10

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

私のアプリケーションでこのクラスを使用すると、正しい値 0 ではなく、値 48 (= !) または 192 が返さint(Integer(b'0')) れることがあります。これは、値 0 に対してのみ発生するようです。最初に文字列にデコードするか、に渡すかは違いはありません。問題は、 をwithに変換することにあります。ord('0')str(Integer(b'0'))'0'b'0'int(b'0')IntegerInteger(0)intint()

さらに、これはランダムな方法で発生します。以降の実行では、アプリケーション (パーサー) のさまざまなポイントで 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(引数がIntegeris であることがわかっている場合)、条件付きで何度もb'0'印刷すると、結果 48 と 192 がときどき表示されます。int(Integer(b'0'))

どうしたの?

編集- 短いテスト プログラムでは問題を再現できないため、関連するコードをここで利用できるようにしました。基本的には 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 関数呼び出しを検索して、これが何を表しているかを確認します。

4

0 に答える 0