Подтвердить что ты не робот

Использование операторов печати только для отладки

Я много кодировал в Python в последнее время. И я работаю с данными, с которыми я раньше не работал, используя формулы, которые никогда не видели и не имеют дело с огромными файлами. Все это заставило меня написать много отчетов о печати, чтобы проверить, все ли идет правильно и идентифицировать точки отказа. Но, как правило, вывод такой информации не является хорошей практикой. Как использовать инструкции печати только тогда, когда я хочу отлаживать и пропускать их, когда я не хочу, чтобы они печатались?

4b9b3361

Ответ 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 или чего-то еще. Не то чтобы я знал об этом.