Автор: Ishayahu Lastov
Архив метки: 3.x
Хватит использовать “print” для отладки: пятиминутное введение в модуль logging Python’а (Перевод)
- Это руководство короткое
- Для поиска ошибок в коде Вы можете использовать print для просмотра значений переменных
- НЕ делайте этого. Используйте модуль logging
Модуль logging предпочтительнее, так как:- Легко можно поместить указатель времени в каждое сообщение
- Вы можете использовать разные уровни срочности ваших сообщений и фильтровать их по этому уровню
- Когда Вы захотите позже найти / изменить лог-сообщения Вы не перепутаете их с другим выводом команды print
- Если Вы хотите вывести лог в файл, то очень легко будет игнорировать вывод лог-сообщений
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
import logging
logging.basicConfig(filename='log_filename.txt',level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('This is a log message.')
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
fh = logging.FileHandler('log_filename.txt')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
logger.addHandler(fh)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
logger.addHandler(ch)logger.debug('This is a test log message.')
- CRITICAL
- ERROR
- WARNING
- INFO
- DEBUG
Вызов setLevel() устанавливает минимальный уровень логирования, нужный Вам. Например, если Вы используете fh.setLevel(logging.ERROR), тогда будут сообщения с уровнем WARNING, INFO и DEBUG не будут записываться в файл (так как fh - обработчик лог-файла в нашем примере, в отличие от ch, который обрабатывает логи для отображения на экране).Для записи сообщен
ий разного уровня используйте:logger.critical('This is a critical message.')logger.error('This is an error message.')logger.warning('This is a warning message.')logger.info('This is an informative message.')logger.debug('This is a low-level debug message.')
Автор: Ishayahu Lastov
7.3.5. namedtuple() — фабричная функция для кортежей с именованными полями
- collections.namedtuple(typename, field_names, verbose=False, rename=False)
- Возвращает новый подкласс кортежа с именем typename. Новый подкласс используется для создания кортежеподобных объектов, поля которых доступны как для просмотра через атрибуты, так и для индексации и итерации. Экземпляры этого подкласса так же содержат строку документации (с именем типа и именами полей) и полезный метод __repr__(),который отображает содержимое кортежа в форме name=value.field_names — одна строка, где каждое имя поля отделено от другого пробелами и/или запятыми, например 'x y' or 'x, y'. Кроме того, в этом параметре можно передать последовательность строк ['x', 'y'].Любые корректные идентификаторы Python могут использоваться в качестве имён полей, за исключением имён, начинающихся с нижнего подчёркивания. Корректные идентификаторы состоят из букв, цифр и нижних подчёркиваний, но не начинается с цифры или нижнего подчёркивания, а так же не может совпадать с одним из keyword например class, for, return, global, pass, или raise.Если rename=true, некорректные имена полей автоматически заменяются позиционными именами, например ['abc', 'def', 'ghi', 'abc'] будет преобразовано в ['abc', '_1', 'ghi', '_3'], заменив ключевое слово def и повторяющееся имя поля abc.Если verbose = true, определение класса будет напечатано после того, как класс будет создан. Эта опция устаревшая, вместо неё проще распечатать атрибут _source.Экземпляры именованного кортежа не имеют своего личного словаря, так что они занимают не больше места, чем обычные кортежи..Изменения в версии 3.1: Добавлена поддержка метода rename.
- classmethod somenamedtuple._make(iterable)
- Метод класса, который создаёт новый экземпляр из существующей последовательности или итератора.
- somenamedtuple._asdict()
- Возвращает новый OrderedDict который отображает имена полей на соответствующие значения. Обратите внимание, что этот метод уже не требуется, так как тот же самый эффект может быть достигнут при помощи встроенной функции vars():
- somenamedtuple._replace(kwargs)
- Возвращает новый экземпляр именованного кортежа, заменяя определённые пля новыми значениями:
- somenamedtuple._source
- Строка с исходным кодом Python, используемым для создания класса именованного кортежа. Этот код позволяет легко получить документацию для именованного кортежа. Его можно вывести на экран, выполнить при помощи exec(), или сохранить в файл и импортировать.Добавлено в версии 3.3.
- somenamedtuple._fields
- Кортеж строк с именами полей. Полезен для интроспекции и для создания новых типов именованных кортежей из уже существующих.
- Именованные кортежи для Python 2.4.
- Абстрактный базовый класс именованного кортежа с примешиваемым метаклассом от Jan Kaliszewski. Помимо предоставления абстрактного базового класса для именованных кортежей, он так же поддерживает альтернативный конструктор, основанный на метаклассе.
Автор: Ishayahu Lastov
Выражение raise
raise_stmt ::= «raise» [expression [«from» expression]]
В случае отсутствия expression, повторно возбуждается последнее исключение, которое было активно в данной области. Если такого исключения нет, то возбуждается исключение RuntimeError, чтобы сообщить о данной ошибке.
В противном случае raise выполняет первый expression и получает объект исключения. Он должен являться либо подклассом либо экземпляром BaseException. Если первый expression является именем класса, то создается объект путём вызова класса без передачи аргументов. Читать