Каков наилучший способ переключения печати Python? - PullRequest
8 голосов
/ 02 апреля 2009

Я использую Python 2.4 в игровом движке и хочу отключить все отпечатки, если это необходимо. Например, я хотел бы включить распечатки для отладочной сборки, а затем отключить для сборки выпуска. Также необходимо, чтобы он был максимально прозрачным.

Мое решение этой проблемы в коде C движка состоит в том, чтобы внутри макроса vararg была функция printf, и было определено, что она ничего не делает в сборке выпуска.

Это мое текущее решение:

DebugPrints = True
def PRINT (*args):
    global DebugPrints
    if DebugPrints:
        string = ""
        for arg in args:
            string += " " + str(arg)
        print string

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

Мне интересно, можете ли вы что-нибудь сделать для работы ключевого слова print?

Ответы [ 6 ]

12 голосов
/ 02 апреля 2009

да, вы можете назначить sys.stdout на все, что захотите. Создайте небольшой класс с методом write, который ничего не делает:

class DevNull(object):
    def write(self, arg):
        pass

import sys    
sys.stdout = DevNull()
print "this goes to nirvana!"

Используя ту же технику, вы также можете записать свои отпечатки в файл, установив sys.stdout для открытого объекта файла.

10 голосов
/ 02 апреля 2009

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

if __debug__:
    print "whoa"

Если вы вызываете Python с -O или -OO (как обычно, для сборки выпуска), __debug__ устанавливается на False. Еще лучше то, что __debug__ - это особый случай для переводчика; он фактически удалит этот код при записи файлов pyc/pyo, что сделает полученный код меньше / быстрее. Обратите внимание, что вы не можете присваивать значения __debug__, поэтому он полностью основан на этих аргументах командной строки.

9 голосов
/ 02 апреля 2009

Модуль регистрации - это "лучший" способ ... хотя я довольно часто просто использую что-то простое, как ...

class MyLogger:
    def _displayMessage(self, message, level = None):
        # This can be modified easily
        if level is not None:
            print "[%s] %s" % (level, message
        else:
            print "[default] %s" % (message)

    def debug(self, message):
        self._displayMessage(message, level = "debug")
    def info(self, message):
        self._displayMessage(message, level = "info")

log = MyLogger()
log.info("test")
3 голосов
/ 02 апреля 2009

Не используйте print, но создайте консольный класс, который обрабатывает всю печать. Просто сделайте вызовы к консоли, и консоль может решить, действительно ли их печатать. Класс консоли также полезен для таких вещей, как сообщения об ошибках и предупреждениях, или для перенаправления туда, куда выводятся данные.

1 голос
/ 10 сентября 2015

Если вы действительно хотите переключить печать:

>>> import sys
>>> import os
>>> print 'foo'
foo
>>> origstdout = sys.stdout
>>> sys.stdout = open(os.devnull, 'w')
>>> print 'foo'
>>> sys.stdout = origstdout
>>> print 'foo'
foo

Однако я рекомендую использовать только print для одноразового кода. Используйте logging для реальных приложений, как описано в оригинальном вопросе. Это допускает скользящую шкалу многословия, поэтому вы можете вести только важные записи или более подробные записи, как правило, менее важных деталей.

>>> import logging
>>> logging.basicConfig(level=logging.DEBUG)
>>> logging.debug('foo')
DEBUG:root:foo

Например, использование может включать журналы отладки в вашем коде. Затем, чтобы заставить их замолчать, измените свой уровень на более высокий уровень, один из INFO, WARN или WARNING, ERROR или CRITICAL или FATAL

>>> logging.root.setLevel(logging.INFO)
>>> logging.debug('foo')
>>>

В сценарии вы просто хотите установить это в basicConfig следующим образом:

import logging
logging.basicConfig(level=logging.INFO)

logging.debug('foo') # this will be silent

Более сложные способы ведения журналов можно найти в документации .


0 голосов
/ 09 сентября 2015

Я ответил на этот вопрос в другом сообщении , но вопрос был помечен как дубликат:

во всяком случае, вот что я бы сделал:

from __future__ import print_function
DebugPrints = 0

def print(*args, **kwargs):
    if DebugPrints:
        return __builtins__.print(*args, **kwargs)

print('foo') # doesn't get printed
DebugPrints = 1
print('bar') # gets printed

к сожалению, вы не можете сохранить синтаксис py2 print print 'foo'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...