2

私がやろうとしているのは、ファイル「TCPStreamPayload」が書き込まれるたびに、その情報がファイルに追加されるたびに増加するカウンターが必要です。

たとえば、私は持っています:

payloadRecon = open('TCPStreamPayload.txt','a')

segmentCount = 0

--my script here--

それから一番下に

if payloadRecon.write:
    segmentCount +=1
payloadRecon.write('####TCP PAYLOAD STREAM RECONSTRUCTION. Segment ' + str(segmentCount) + '######' '\n\n\n\n').

基本的に、スクリプトを使用してこのファイルに書き込むたびに、セグメント番号を 1 ずつ増やします。

4

1 に答える 1

5

あなたは本当にラッパークラスを書いて、プレーンの代わりにそれを使うべきですfile:

class CountingWrapper(object):
    def __init__(self, *args, **kwargs):
        self.segment_count = 0
        self.f = open(*args, **kwargs)
    def write(self, *args, **kwargs):
        self.segment_count += 1
        return self.f.write(*args, **kwargs)

payloadRecon = CountingWrapper('TCPStreamPayload.txt', 'a')
payloadRecon.write('dsfsd')
assert payloadRecon.count == 1

あるいは、3 行のコードをまとめて、何度も繰り返す必要がないようにする場合は、ラッパー関数を記述できます。

segmentCount = 0
def payload_write(f, *args, **kwargs):
    global segmentCount
    segmentCount += 1
    return f.write(*args, **kwargs)

さて、数えて書くには、このワンライナーが必要です。

payload_write(payloadRecon, '####TCP PAYLOAD STREAM RECONSTRUCTION. Segment ' + str(segmentCount) + '######' '\n\n\n\n')
assert segmentCount == 1

複数のメソッドをラップする必要がある場合、クラスはより柔軟です。しかし、関心のある他のメソッドを委任する必要があることは明らかです。もちろん、 を介して動的に委譲を行うこともできます__getattr__。または、継承を使用することもできます。(ただし、3.x では、クラスは ではなく、パッケージfile内のクラスの 1 つであることを覚えておいてください。いずれにせよ、またはコンストラクターによって作成することは想定されていませんが、を置き換えるラッパーファクトリ関数. 良いニュースは, を処理する必要がないことです.iofileio.whateveropenopen__new____init__

3.x では、インスタンスにモンキー パッチを適用することもできます (ただし、これfile.writeは読み取り専用の 2.x では機能しません)。

payloadRecon = open('TCPStreamPayload.txt', 'a')
segmentCount = 0
write_original = payloadRecon.write
def write_and_count(self, *args, **kwargs):
    global segmentCount
    segmentCount += 1
    write_original(self, *args, **kwargs)
payloadRecon.write = write_and_count

しかし、実際には、物事を明確にしておくことが、おそらくここに行く方法です。

于 2013-02-27T20:27:06.013 に答える