Python имеет несколько способов вывода «трассировки». print
, import logging
, stdout.write
можно использовать для печати отладочной информации, но все они имеют один недостаток: даже если порог регистратора слишком высок или поток закрывается, Python по-прежнему оценивает аргументы оператора печати. ( Strict Evaluation ) Это может стоить строкового формата или дороже.
Очевидное исправление - поместить код создания строки в лямбда-выражение и использовать нашу собственную функцию ведения журнала для условного вызова лямбда-выражения (эта функция проверяет встроенную переменную __ 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)
и строки.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
? Или у кого-нибудь есть альтернативы представленным здесь методам?