Условно вычисляемые операторы отладки в Python

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 ? Или у кого-нибудь есть альтернативы представленным здесь методам?

12
задан codewarrior 3 October 2011 в 11:39
поделиться