Давайте начнем с моего вопроса: можете ли вы написать код лучше, чем приведенный ниже?
FRAME_DELIMITER = b'\x0a\x0b\x0c\x0d'
def get_data():
f = bytearray();
# detect frame delimiter
while True:
f += read_byte()
if f[-4:] == FRAME_DELIMITER:
start = len(f)-2
break
# read data until next frame delimiter
while True:
f += self._read_byte()
if f[-4:] == FRAME_DELIMITER:
return f[start:-2]
В двух словах, этот код читает поток данных и возвращает весь кадр. Каждый кадр ограничен 0x0a 0x0b 0x0c.Функция read_byte читает один байт в потоке данных (возможно, было бы удобно получить буфер из x байтов).
Я заглянул в документацию Python, чтобы попытаться написатьэтот код более питоническим способом (и лучшей производительностью?).
Я пришел к генераторам и итераторам.
Мы могли бы представить себе такой генератор:
def my_generator(self):
while True:
yield self._read_byte()
и поэкспериментируйте со списком и списками символов, как этот:
f = b''.join(itertools.takewhile(lambda c: c != b'\x03', self.my_generator()))
Но на самом деле я застрял, потому что мне нужно проверить шаблон разделителя, а не только один символ. Не могли бы вы помочь дать мне правильное направление ... Или, может быть, мой код выше именно то, что мне нужно?!
Спасибо!