Советы и уловки

Python StdOuts: не печатать, а регистрировать!

Питонический способ отображения статусных сообщений

Часто на Python, особенно новичок, вы можете print () переменную, чтобы увидеть, что происходит в вашей программе. Возможно, если вы будете полагаться на слишком много операторов печати в своей программе, вы столкнетесь с кошмаром необходимости комментировать их все ближе к концу. Гораздо более питонический способ увидеть, что делает программа, - это ведение журнала. Затем вы можете ограничить печать выводами командной строки, которые хочет видеть конечный пользователь.

Зачем логин?

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

  1. Вы хотите различать вывод отладки и вывод программы
  2. Вы не хотите, чтобы в конечном продукте использовались нерелевантные стандартные параметры.
  3. Вы хотите отключить весь стандартный вывод после разработки и тестирования
  4. Вы хотите сохранить историю выполнения программы в файл с метаинформацией, такой как время, и более подробной информацией об отладке.

Как войти?

Вы входите в систему Python, используя модуль ведения журнала.

import logging

Модуль регистрации предоставляет несколько состояний по умолчанию для регистрации различных сообщений о состоянии в вашей программе. Уровни по умолчанию: DEBUG, INFO, WARNING, ERROR и CRITICAL.

Если вы выполните следующую программу:

import logging
import os

savepath = ‘path/to/save/at/’
if not os.path.exists(savepath):
  logging.warning(‘Warning! The savepath provided doesn\’t exist!'     
                  'Saving at current directory ‘)
  savepath = os.getcwd() 
  logging.info(‘savepath reset at %s’,str(savepath))
else:
    logging.info('Savepath provided is correct,'
                 'saving at %s’,str(savepath))

Путь в примере не существует. Вы увидите следующий результат:

WARNING:root:warning! The savepath provided doesn’t exist!Saving at current directory

Информация о новом текущем пути сохранения, то есть logging.info, не отображается.

Это связано с тем, что по умолчанию уровень серьезности вывода - «предупреждение». Порядок серьезности следующий:

DEBUG

INFO

WARNING (по умолчанию)

ERROR

CRITICAL

Если вы хотите видеть выходные данные с более низким уровнем серьезности, вы должны явно указать их в конфигурации ведения журнала. После этой настройки запустите новый интерпретатор, иначе ничего не получится.

logging.basicConfig(level = logging.DEBUG)

Теперь все будет распечатано, начиная с уровня отладки.

выход:

WARNING:root:warning! The savepath provided doesn’t exist! Saving at current directory 
INFO:root:savepath reset at path/to/current/directory

Это замечательно! Но для получения приличного журнала мы, возможно, захотим увидеть больше информации и сделать ее доступной в отдельном файле. Это можно установить, используя формат и имя файла в конфигурации. Добавьте желаемую конфигурацию в начало вашего файла:

logging.basicConfig(filename=’logfilename.log’,level = 
                    logging.DEBUG,format=’%(asctime)s %
                    (message)s’,
                    datefmt=’%d/%m/%Y %I:%M:%S %p’)

Это записывает вашу информацию в logfilename.log вместе с отметками времени.

13/06/2020 05:14:47 PM warning! The savepath provided doesn’t exist!  
                       Saving at current directory 
13/06/2020 05:14:47 PM savepath reset at current/working/directory

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

filemode='w'

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

logger = logging.getLogger()
logger.disabled = True

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

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