Pull to refresh

Comments 29

argparse вместо docopt выбран из-за нежелания ставить зависимости?
UFO just landed and posted this here
Занятная библиотека. На момент реализации не слышал о такой.
В целом можно переехать на нее, так как все равно нужно подтягивать pika
А чем он лучше? Я как-то к argparse привык
Читаемость/самодокументируемость, argparse лучше тем, что он в стандартной поставке, но на мой взгляд он весьма уродлив.
Привыкнуть можно ко всему, но лучше к хорошему привыкать.
rmq_params.file.write(rk + '\n')

чтобы понять что это за зверь rmq_params пришлось поиском по файлу пройти — мне кажется лучше минимизировать использование глобальных переменных и передавать всё нужное для функции параметрами.
Тут есть заморочка с тем, что обработчик
def on_message(channel, method_frame, header_frame, body):

вызывается из встроенного в pika метода. Набор входных параметров такого метода фиксирован требованиями pika.
1. rmq_params стоит переименовать, я так понимаю это cmd_line_arguments
2. В функции on_message объявлять глобальные переменные, потом вызывать функцию типа process_message в которую всё передавать явно и из которой даже можно возвращать новые значения счётчиков чтобы минимизировать использование глобальных переменных, а после process_message уже вызывать channel.basic_ack
Для примера набросал псевдокод on_message и process_message.
Параметров только много, надо либо именованными сделать, либо сгруппировать их в осмысленные объекты, либо разбить process_message на несколько независмых функций, но для пояснения того что я написал думаю достаточно.
В предложенном варианте по сути просто вынос обработчика process_message. Можно сделать и так. Но профит не очевиден)
Профит в том, что:
  1. Код обработчика, по сути служебный хендлер, отделён от кода которые делает то что нужно нам.
  2. Основной код, делающий что нужно, не пользуется глобальными переменными.

а дальше уже можно думать как улучшать этот код, разбивать на функции и т.п.
sys.stdout.write

почему не print?

'[' + rmq_tools.time_now() + '] — ' + str(all_cnt) + ' of ' + str(lim) + ' messages consumed. \r'

не лучше ли будет написать что-то вроде
'[{}] — {} of {} message consumed'.format(rmq_tools.time_now(),str(all_cnt),str(lim))
UFO just landed and posted this here
Конечно, если есть свежий питон, то так намного лучше.
тайтла автора

да, от скромности страданий не видать )
почему не print?

Когда задался вопросом перезаписи строки в консоли нашел такое решение.
Действительно можно заменить на
print '[{}] — {} of {} message consumed /r'.format(rmq_tools.time_now(),str(all_cnt),str(lim)),

хотя запятая в конце режет глаз
str() таком случае не нужен, это я просто скопировал не подумав.
А зачем использовать второй питон?
Вариант с print не выводил вообще ничего. Остановимся на:
sys.stdout.write(f'[{rmq_tools.time_now()}] - {all_cnt} of {lim} messages consumed.\r')
UFO just landed and posted this here
Он ещё и потокобезопасный) можно вообще не заморачиваться и писать сразу в файл хоть в тысячу потоков/процессов.
Попробуй logging. Сразу и на вывод и в лог. Причем с разной степенью verbosity.
import logging
 
# add filemode="w" to overwrite
logging.basicConfig(filename="sample.log", level=logging.INFO)
 
logging.debug("This is a debug message")
logging.info("Informational message")
logging.error("An error has happened!")
Ну и для читемости хорошо бы побить на мелкие функции со смысловыми названиями, например запись в файл вынести в функцию с соответствующим названием и там использовать with.
Ещё стоит статические анализторы прогонять, как минимум flake8, pylint
Важно знать, что pika — not threadsafe. Amqpstorm хорошо подходит в качестве замены.
Интересный вариант. Описанная поделка делалась больше года назад. Главной задачей было быстро получить небольшую утилитку. Amqpstorm мне тогда не попался.
Sign up to leave a comment.

Articles