python - нет лучшего способа получить выражение в функции отладки
В коде C я часто использую макрос отладки printf, как
#define DPRINT_INT(i) fprintf(stderr,"%s has the value %i at line %i", #i,i, __LINE__)
а затем я могу делать такие вещи, как DPRINT_INT(высота), где он будет печатать переменную, или такие вещи, как DPRINT_INT(from_cm_to_inch(get_average(heights)))), и он будет печатать все выражение для имени.
Чтобы сделать это для Python, так как Python не имеет C-подобные макросы
Я передаю строку и использую inspect, чтобы получить среду вызывающих функций для вызова eval. Но я не люблю передавать строки, это некрасиво и легко забыть (я проверил тип и вызвал исключение, если ему передали не строку) и не работает с ide.
Нет никакого способа извлечь имена переменных и выражения из кода Python для функции отладки? есть?
1 ответ
В Python мы, как правило, пишем модули, которые можем тестировать и / или импортировать в REPL, и в случае необходимости выводить их туда.
Если вы можете выполнить модульное тестирование своих функций, вы можете доказать их поведение для любого заданного входа. Однако, если вы должны написать отладочные операторы, вы должны использовать debug()
от стандарта logging
модуль.
Например:
#!/usr/bin/env python
import logging
import inspect
def buggy_fn():
d = 42;
if d != 69:
logging.debug('%s(%d): %s is not what we expected. [%s]',
inspect.currentframe().f_back.f_code.co_filename,
inspect.currentframe().f_back.f_lineno,
'd',
repr(d),
)
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
buggy_fn()
Будет выводить...
DEBUG:root:./buggy.py(19): d is not what we expected. [42]
Есть множество полезных вещей в inspect
это может помочь вам в трудный час.