Советы и уловки
Python StdOuts: не печатать, а регистрировать!
Питонический способ отображения статусных сообщений
Часто на Python, особенно новичок, вы можете print () переменную, чтобы увидеть, что происходит в вашей программе. Возможно, если вы будете полагаться на слишком много операторов печати в своей программе, вы столкнетесь с кошмаром необходимости комментировать их все ближе к концу. Гораздо более питонический способ увидеть, что делает программа, - это ведение журнала. Затем вы можете ограничить печать выводами командной строки, которые хочет видеть конечный пользователь.
Зачем логин?
Ведение журнала - удобный инструмент для просмотра статуса программы на этапе разработки. Идеально, если:
- Вы хотите различать вывод отладки и вывод программы
- Вы не хотите, чтобы в конечном продукте использовались нерелевантные стандартные параметры.
- Вы хотите отключить весь стандартный вывод после разработки и тестирования
- Вы хотите сохранить историю выполнения программы в файл с метаинформацией, такой как время, и более подробной информацией об отладке.
Как войти?
Вы входите в систему 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. Ведение журнала предлагает гораздо большую гибкость, чем описано выше (обработчики, фильтры, изменение уровней журнала по умолчанию и т. Д.), Но этого должно быть достаточно, чтобы начать использовать базовое ведение журнала и покончить с операторами печати.