Вы действительно должны написать класс обертки и использовать это вместо простой 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
В качестве альтернативы, если вы просто пытаетесь завернуть три строки кода, так что вам не придется повторять себя, вы можете просто написать функцию обертку:
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
, но один из классов в пакете io
, и вы не должны создавать либо конструкцию конструктора file
, либо io.whatever
, но по open
, будет еще нужно написать функцию обертки фабрики, чтобы заменить open
. хорошая новость заключается в том, что означает, что вам не нужно обрабатывать __new__
, просто __init__
.)
в 3.x, можно даже monkeypatch экземпляра (но это не будет работать в 2.x, где file.write
доступен только для чтения):
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
Но на самом деле , явное сохранение вещей, вероятно, путь сюда.
Действительно ли ваш вопрос, как я могу запомнить последнее значение 'segmentCount' между вызовами моего скрипта? Или я неправильно понял? – Skurmedel
Не могли бы вы просто вызвать 'payloadRecon.write', а затем после' segmentCount + = 1'? Вы можете поставить 'try' вокруг записи, если вы обеспокоены тем, что это не сработает. Какую ошибку вы видите? – GordonsBeard