iter (вызываемая, часовая) форма в байтовом массиве - PullRequest
0 голосов
/ 11 ноября 2018

Я использую API, который возвращает сообщения, оканчивающиеся байтом \ x04 (конец передачи). Я хотел бы поймать этот байт хорошим способом. Это код, который я написал:

# Only works if buffer size is 1 byte
read = lambda: self._sslsocket.recv(1)

response = b''
for data_buffer in iter(read, b'\x04'):
    response += data_buffer

Я бы хотел, чтобы это решение работало с буфером произвольного размера. Есть ли способ сделать это без снижения производительности, или я должен использовать генератор / классический, пока True с recv (1024)?

1 Ответ

0 голосов
/ 11 ноября 2018

Вы можете закодировать его одним из следующих двух способов:

def read(bufsize):
    return lambda: self._sslsocket.recv(bufsize)

или более кратко как:

read = lambda bufsize: lambda: self._sslsocket.recv(bufsize)

Пример использования:

response = b''
for data_buffer in iter(read(1), b'\x04'):
    response += data_buffer

По сути, они превращают локальную функцию read() в очень специализированный декоратор (функция, которая возвращает функцию).

...