Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Как сделать данный код более компактным?

#python #инспекция_кода #рефакторинг


def rcvdata(cmd,size):
    global s;
    s.settimeout(1)
    try:
        sendCommand(cmd);data = s.recv(size)

    except:
        try:
           sendCommand(cmd);data = s.recv(size)

        except:
            try:
                sendCommand(cmd);data = s.recv(size)

            except:
                try:
                    sendCommand(cmd);data = s.recv(size)

                except:
                    try:
                        sendCommand(cmd);data = s.recv(size)

                    except:                       
                        try:
                            sendCommand(cmd);data = s.recv(size)

                        except:
                            s.close()

    return(data)

    


Ответы

Ответ 1



def rcvdata(cmd, size): data = None s.settimeout(1) for trying in range(6): try: sendCommand(cmd) data = s.recv(size) except: if trying == 5: # Последняя попытка, неудачная s.close() return data Или если надобности в каких-то действиях после цикла нет, то можно уменьшить вложенность: def rcvdata(cmd, size): s.settimeout(1) for _ in range(6): try: sendCommand(cmd) return s.recv(size) except: pass # Здесь по желанию можно воткнуть time.sleep(1) # Сюда мы попадаем только после шести неудачных попыток s.close() return None Почитайте в любом учебнике Python про циклы. А ещё нехорошо перехватывать ВСЕ исключения, потому что тогда программу невозможно будет закрыть (выход — тоже вполне себе исключения SystemExit и иногда KeyboardInterrupt), а также будут пропущены баги внутри sendCommand. Следует перехватывать только те исключения, которые здесь ожидаются (здесь, наверно, что-то вроде socket.error или IOError). А ещё s.recv(size) не гарантирует, что придёт ровно size байт — в зависимости от качества связи, особенностей ОС, фазы Луны и звёзд на небе может вернуться меньше. А по таймауту — и вовсе просто ноль байт. Не знаю, нужно ли это в вашем конкретном случае, но про это желательно не забывать. В общем, плоховат код всё равно

Ответ 2



Предложу свой вариант с задержкой между вызовом recv в 1 секунду и 10 попытками: def rcvdata(cmd, size): global s s.settimeout(1) max_count = 10 while True: try: max_count -= 1 if max_count <= 0: return sendCommand(cmd) data = s.recv(size) return data finally: s.close()

Ответ 3



Оставлю и я свой вариант_) def rcvdata(cmd,size): global s; s.settimeout(1) t = 0 while t!=7: try: sendCommand(cmd) data = s.recv(size) except: t+=1 s.close()

Комментариев нет:

Отправить комментарий