
Кажется, должно быть так «У вас есть непрочитанные сообщения от Александры», пол пользователя не учитывается.
Архив рубрики: Uncategorized
Бесплатный совет
Существуют люди которые когда пишут код в vim запускают тесты из него же, не переключаясь на консоль.
Они просто не знают что если войти в режим команд и набрать ! то все что будет напечатано после этого будет выполнено в консоли, кроме этого символ % будет заменен на текущее имя файла. Более продвинутые знатоки еще и ремапят мнемокоды для этого и получается вообще крутяк.
Не особо задумывался над самим термином «бинарный» или «тернарный» в контексте функций, пока не начал изучать эрланг, там термин «арность» очень широко распространен. Кроме этого, Мартин Фаулер в своей книге о чистом коде пишет о количестве параметров в функциях и оперирует этими терминами, он говорит что функции бывают:
- нуль-арные
- унарные
- бинарные
- тернарные
- полиарные
И это всем ясно, но спроси у программиста что такое арность и он задумается что сказать.
изучаю erlang
epson printer driver for ubuntu
Логгирование с повторным использованием параметров
В проекте discounter я использовал простое логирование с помощью модуля logging. Проект состоит из модулей которые пишут свои сообщения в один и тот же файл. Понятно, что можно изменить шаблон логов таким образом для определения того кто пишет
logging.Formatter("%(asctime)-15s %(levelname)-8s [%(moduleName)-10s] %(message)s")
Где moduleName есть имя модуля. Это все довольно просто. Но мне не нравится всегда писать длинные конструкции вроде
self._log.info("Лог в файл %s", var, moduleName=moduleName)
Т.е. вечно пихать в и так длинную строку еще имя модуля. Т.о. предлагаю такое решение: В классе модуля переопределить __getattr таким образом
def __getattr__(self, name):
try:
return self._logNamesPart[name]
except KeyError:
obj = getattr(self._log, name)
if obj is not None:
part = partial(obj, moduleName=self.__class__.__name__)
self._logNamesPart[name] = part
return part
else:
self._log.error("Попытка вызова несуществующего типа лога "%s"",
name, moduleName=self.__class__.__name__)
Теперь при создании лога я пишу так
self.debug("Запущен парсер")
и все. При этом создается запись с необходимым именем модуля. Объясню код: существует удобная функция partial с помощью которой можно повторно вызывать функцию не повторяя каждый раз параметры вызова, а указывать только изменившиеся. Получается что при вызове лога с уровнем info, создается partial-функция и сохраняется во внутреннее свойство _logNamesPart, в следующий раз при вызове info, partial будет взят от туда, а если будет вызван другой метод, например debug, он также будет создан и сохранен для последующего использования. В результате я укоротил вызов лога с
self._log.debug("Запущен парсер", moduleName=moduleName)
до
self.debug("Запущен парсер")
