Показаны сообщения с ярлыком logging. Показать все сообщения
Показаны сообщения с ярлыком logging. Показать все сообщения

Python: property object вместо значения

Не раз уже бывало, что при разработке на Python в какой-то части кода вместо значения интересующей переменной в дебаг-лог попадает сообщение вроде этого:
INFO src.wiki.views views.dispatch:123 'content': '<property object at 0x10ae22f70>'
То, что у получение значения content в этом классе реализовано через property,- и так понятно, но почему вылезает этот самый самый загадочный property object вместо значения? Всё не просто, а очень просто: во всех этих случаях была попытка получить значение из функции, обёрнутой в @property, но не из экземпляра класса, а из самого класса.

Такое происходит из-за того, что в Python всё является объектами, даже классы. Запрашивая свойство (property) у класса вместо экземпляра,- получаем запрошенное, но это не значение,- а сам метод, вложенный в объект property.

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

Python: наследование и логирование

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

Уровни DEBUG

Надоело уже путаться какие уровни дебага какие типы сообщений пропускают. Проверил на Python 2.x с использованием стандартного модуля logging, получается такая таблица:

Уровень сообщения в логе
Уровень лога  DEBUG   INFO   WARNING   ERROR   CRITICAL 
DEBUG
V
V
V
V
V
INFO
V
V
V
V
WARNING
V
V
V
ERROR
V
V
CRITICAL
V

Получается, что если хочется самый чистый лог,- ставим уровень в CRITICAL и видим только критичные события в логе. Надо чуть подробнее,- ставим ERROR, видим сообщения типа ERROR и CRITICAL, и так далее. Самый подробный уровень DEBUG показывает все типы сообщений от самых низкоуровневых DEBUG до CRITICAL. Почему-то у меня никак не уложится в голове, что INFO идёт сразу за DEBUG