Я много кодировал в Python в последнее время. И я работаю с данными, с которыми я раньше не работал, используя формулы, которые никогда не видели и не имеют дело с огромными файлами. Все это заставило меня написать много отчетов о печати, чтобы проверить, все ли идет правильно и идентифицировать точки отказа. Но, как правило, вывод такой информации не является хорошей практикой. Как использовать инструкции печати только тогда, когда я хочу отлаживать и пропускать их, когда я не хочу, чтобы они печатались?
Использование операторов печати только для отладки
Ответ 1
В модуле logging
есть все, что вам нужно. Сначала это может показаться чрезмерным, но использовать только те части, которые вам нужны. Я бы рекомендовал использовать logging.basicConfig
для переключения уровня ведения журнала на stderr
и простые методы ведения журнала, debug
, info
, warning
, error
и critical
.
import logging, sys
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
logging.debug('A debug message!')
logging.info('We processed %d records', len(processed_records))
Ответ 2
Используйте logging встроенный библиотечный модуль вместо печати.
Вы создаете объект Logger
(скажем Logger
), а затем после этого, всякий раз, когда вы вставляете отладочную печать, вы просто ставите:
logger.debug("Some string")
Вы можете использовать logger.setLevel
в начале программы, чтобы установить выходной уровень. Если вы установите его в DEBUG, он напечатает все отладки. Установите его в INFO или выше, и сразу все отладки исчезнут.
Вы также можете использовать его для регистрации более серьезных вещей на разных уровнях (INFO, WARNING и ERROR).
Ответ 3
Простым способом сделать это является вызов функции ведения журнала:
DEBUG = True
def log(s):
if DEBUG:
print s
log("hello world")
Затем вы можете изменить значение DEBUG
и запустить свой код с помощью или без ведения журнала.
Стандартный logging
модуль имеет более сложный механизм для этого.
Ответ 4
Я не знаю о других, но я был использован для определения "глобальной константы" (DEBUG
), а затем глобальной функции (debug(msg)
), которая печатала бы msg
, только если DEBUG == True
.
Затем я пишу свои отладочные инструкции, например:
debug('My value: %d' % value)
... затем я подбираю модульное тестирование и никогда не делал этого снова!:)
Ответ 5
Во-первых, я назначу номинацию python logging. Однако будьте осторожны, как вы его используете. В частности: пусть структура ведения журнала расширяет ваши переменные, не делайте этого самостоятельно. Например, вместо:
logging.debug("datastructure: %r" % complex_dict_structure)
убедитесь, что вы сделали:
logging.debug("datastructure: %r", complex_dict_structure)
потому что, хотя они выглядят одинаково, первая версия несет цену repr(), даже если она отключена. Вторая версия избегает этого. Точно так же, если вы откажетесь от своего собственного, я бы предложил что-то вроде:
def debug_stdout(sfunc):
print(sfunc())
debug = debug_stdout
вызванный через:
debug(lambda: "datastructure: %r" % complex_dict_structure)
который, опять же, избежит накладных расходов, если вы отключите его, выполнив:
def debug_noop(*args, **kwargs):
pass
debug = debug_noop
Накладные расходы на вычисление этих строк, вероятно, не имеют значения, если они либо 1) дороги для вычисления, либо 2) оператор отладки находится в середине, скажем, цикла n ^ 3 или чего-то еще. Не то чтобы я знал об этом.