Улучшение кода на python

#python

Вопрос:

Я сталкиваюсь со следующим сценарием :

Я устанавливаю DEBUG=True/False и на основе этого веду журнал.

Традиционным способом сделать это является

 if DEBUG:
   logger.log(whatever)
 

Есть ли лучший способ написать этот код? Использование замыканий/лямбда-функций и т.д. ?

Ответ №1:

Посмотрите руководство по библиотеке журналов: http://docs.python.org/library/logging.html

вы можете настроить непосредственно в коде или в файле конфигурации …

напр.

 import logging
logging.basicConfig(filename='example.log',level=logging.INFO)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
 

(смотрите, как он будет отображать только информацию и предупреждающие сообщения)

или из файла:

 import logging
import logging.config

logging.config.fileConfig('logging.conf')

# create logger
logger = logging.getLogger('simpleExample')

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
 

Формат конфигурации ведения журнала см. в разделе конфигурация. http://docs.python.org/howto/logging.html#configuring-logging

Актуальность logging.getLogger(…) заключается в том, что он позволяет устанавливать разные уровни ведения журнала для разных частей вашего кода.

Правка: если вы беспокоитесь о дорогостоящих операциях, лучше всего использовать следующее:

 if logger.isEnabledFor(logging.DEBUG):
    logger.debug('Message with %s, %s', expensive_func1(),
                                        expensive_func2())
 

ХТ

Ответ №2:

Ты слишком много об этом думаешь. У вас есть 2 строки кода, которые очень ясны и лаконичны. Вы мало что могли бы сделать, чтобы изменить это, не усложняя ситуацию.

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

 def log(msg):
  if DEBUG:
    logger.log(msg)
 

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

Комментарии:

1. Это работает нормально, пока вам не понадобятся некоторые дополнительные функции ведения журнала, такие как предупреждения/информация/ сообщения (не все сообщения ведения журнала предназначены для отладки. Некоторые из них необходимы в производстве), мелкозернистая конфигурация, внешняя конфигурация (в файлах, а не в коде), замена переменных … кроме того, вы можете в конечном итоге использовать модули, которые уже используют библиотеку «ведение журнала». Поэтому лучше использовать такое решение, как предварительно подготовленная библиотека ведения журнала ..

Ответ №3:

В данном конкретном случае вы могли бы рассмотреть возможность использования модуля ведения журнала python, который будет обрабатывать это (и другие потребности в ведении журнала) для вас. В своем самом базовом воплощении:

 # Call once somewhere early in your code
logging.basicConfig(level=DEBUG and logging.DEBUG or logging.INFO)
....

logging.debug(whatever)
 

Следует обратить внимание на то, что «все, что угодно» всегда будет оцениваться (в отличие от вашего примера).

Комментарии:

1. .. но ответ amir75 более полный 🙂