python - нет лучшего способа получить выражение в функции отладки - PullRequest
0 голосов
/ 20 декабря 2011

в коде 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 Ответ

2 голосов
/ 20 декабря 2011

В Python мы, как правило, пишем модули, которые мы можем unittest и / или импортировать в 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 есть множество полезных вещей, которые могут помочь вам в трудный час.

...