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')
Integer
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
is であることがわかっている場合)、条件付きで何度も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 関数呼び出しを検索して、これが何を表しているかを確認します。