Эта небольшая заметка будет полезна тем, кто разрабатывает веб приложения (и не только) на удаленном сервере (к примеру используя плагин «Remote development» в Visual Studio Code).

Суть проблемы.

Допустим Вы хотите что-то распечатать в консоль.

hello = "world"
print(hello)
>>> world

Пока программа небольшая, то с этим нет никаких проблем. Предположим что вы работаете с каким либо классом, в котором к примеру ~3000 строчек. Количество "принтов" увеличивается, и понять с первого раза какой "принт" к какой переменной относится становится не просто. Можно конечно писать вот так.

print('hello=', hello)

Да это уже лучше. Но все равно хотелось бы видеть и номер строки и тип переменной. А в некоторых случаях и путь к файлу.

Для таких случаев я написал небольшую (и очень удобную) утилиту, которая облегчит Вам жизнь. Давайте попробуем ее установить.

pip install simple-print

И что-нибудь попечатать.

from simple_print import sprint

master = "yoda"
# Напечатаем имя переменной с номером строки 
sprint(master)    
# И покрасим красным цветом
sprint(master, c="red") 
# Добавим белый фон
sprint(master, c="red", b="on_white") 
# И подчеркивание
sprint(master, c="red", b="on_white", a="underline") 
# И путь к файлу
sprint(master, c="red", b="on_white", a="underline", p=True)
# Вернем как строку
s = sprint(master, s=True) # return as string
# И распечатаем
print(s)
Результат выполнения в консоли
Результат выполнения в консоли

Исходный код можно посмотреть тут https://github.com/Sobolev5/simple-print

Продуктивной и удобной Вам разработки.

Комментарии (11)


  1. SyrexS
    13.09.2022 17:53
    +2

    А чем стандартный логгер не устроил?


    1. Sobolev5 Автор
      13.09.2022 18:04

      Данное решение не является противопоставлением стандартному логгеру, а скорее дополняет его в некоторых ситуациях. Особенно при отладках сложных расчетов (в моем случае).


    1. baldr
      13.09.2022 18:46

      А чем стандартный логгер не устроил?

      "Фатальный недостаток", увы. Сорри за сарказм, но других причин я не вижу.


  1. iuabtw
    13.09.2022 17:59

    У вскода нет remote debugger'а?


    1. Sobolev5 Автор
      13.09.2022 18:06

      Есть, но к примеру для отладки web view (если вы работаете с фреймворком аля Django) он вам вряд ли будет полезен. Впрочем вы можете поделится опытом.


  1. baldr
    13.09.2022 18:43
    +2

    loguru закрывает бОльшую часть потребностей, может выводить стектрейс с содержимым переменных в текущей строке и еще дофига всего.

    А, да, и еще он не тащит за собой pydantic, pika (?!?) и остальные странные зависимости, которые вы зачем-то требуете.

    И тесты у него есть.


    1. Sobolev5 Автор
      13.09.2022 19:24

      Спасибо за интересное решение. Посмотрю.

      По поводу pydantic и pika, они нужны для логирования в кликхаус через rabbitmq. Возможно кому то это также пригодится, но об этой возможности я не стал писать, чтобы не перегружать статью. Примеры есть в документации на github.


      1. baldr
        13.09.2022 19:40

        Андрей, я постараюсь написать помягче, но не факт что у меня получится..

        Ваш код ужасен. Я зашел на гитхаб и попробовал посмотреть на исходники.

        Мало того что этот проект (просто логгер!) тащит за собой какие-то левые файлы с кликхаусом (?), так еще и ставит библиотеки, которые совсем не нужны для заявленной задачи. Файл с кликхаусом, кстати, работать все равно не будет, поскольку он импортирует библиотеку, которая не ставится.

        Возможно кому то это также пригодится, но об этой возможности я не стал писать, чтобы не перегружать статью.

        ну это вот уже вообще за гранью добра и зла. А потом оно еще будет тащить десятки мегабайт из, скажем, pandas? Вдруг понадобится кому?

        Я даже не буду ничего говорить про сам код. Какие-то assert, куча условий.. И, вдобавок, все тело великой функции "sprint()" спрятано под условием "if DEBUG or broker". Хитро.

        Для себя вы можете писать какие угодно велосипеды (и каждый для себя пишет), какого угодно качества. Но если уж вы оформляете это в статью - хотя бы делайте это качественно. Ну и будьте готовы к критике как в этом комментарии, например.


        1. Sobolev5 Автор
          14.09.2022 09:40

          Cделал рефакторинг, пофиксил по вашим замечаниям. Спасибо за критику.

          Теперь "минимальный" пакет ставится pip install simple-print

          "Максимальный" pip install simple-print[broker]

          И да вы правы, это изначально внутренний велосипед для текущих задач, но все же я думаю кому то он будет весьма полезен.


  1. Andrey_Solomatin
    13.09.2022 19:30

    Кажется вы лечите симптомы.

    Предположим что вы работаете с каким либо классом, в котором к примеру
    ~3000 строчек. Количество "принтов" увеличивается, и понять с первого
    раза какой "принт" к какой переменной относится становится не просто.

    Это плохой код, тут не принты нужны а рефакторинг.

    Немного кокретики на примере вашей библиотеки. У кода неприлично высокая цикломатическая сложность. Это проблема. Перепишите на сложность не более 10 и тогда проблема с тем, что непонятно откуда идёт печать изчезнет.

    кто разрабатывает веб приложения (и не только) на удаленном сервере

    Эту жутко неудобно, но иногда приходится. Я решаю эту проблему юнит тестами. При этом подходе практически ничего не надо удалённо дебажить.


    1. Sobolev5 Автор
      14.09.2022 09:43

      К сожалению иногда вам подобные классы достаются в "наследство" от кого-то еще, а задача на рефакторинг задвигается в беклог.