В Python есть несколько способов печати «трассировки» вывода.print
, import logging
, stdout.write
можно использовать для печати отладочной информации, но все они имеют один недостаток: даже если пороговое значение регистратора слишком велико или поток закрыт, Python по-прежнему будет оценивать аргументы оператора print,( Строгая оценка ) Это может стоить строкового формата или более.
Очевидное решение - поместить код, создающий строку, в лямбду и использовать нашу собственную функцию регистрации для вызова лямбдаусловно (проверяется встроенная переменная __debug__
, которая устанавливается в False всякий раз, когда python запускается с -O
для оптимизации):
def debug(f):
if __debug__:
print f()
#stdout.write(f())
#logging.debug(f())
for currentItem in allItems:
debug(lambda:"Working on {0}".format(currentItem))
Преимущество заключается не в вызовах str(currentItem)
и string.format
в сборках релизов, и недостатком является необходимость вводить lambda:
в каждом операторе журналирования.
Оператор Python * assert
специально обрабатывается компилятором Python.Если python запускается с -O
, то любые операторы assert отбрасываются без какой-либо оценки.Вы можете использовать это для создания другого условно оцененного оператора ведения журнала:
assert(logging.debug("Working on {0}".format(currentItem)) or True)
Эта строка не будет оцениваться, когда Python запускается с -O
.
Операторы короткого замыкания 'и'и' или 'можно даже использовать:
__debug__ and logging.debug("Working on {0}".format(currentItem));
Но теперь у нас до 28 символов плюс код для выходной строки.
Вопрос, который я получаю:Существуют ли какие-либо стандартные операторы Python или функции, которые имеют те же свойства условной оценки, что и оператор assert
?Или у кого-нибудь есть альтернативы методам, представленным здесь?