Повторная проверка значений в Traceback - PullRequest
4 голосов
/ 03 марта 2011

Я пытаюсь провести тщательную повторную проверку трассировки и получить фактические значения от объектов, которые не могут вернуть больше (лучше?) Информации вместе с трассировкой.

Сценарий случая находится вфункция, которую я импортирую и выполняю, выглядит следующим образом:

def foo():
    a = True
    b = False
    assert a == b

И выполняется следующим образом:

from foo import foo

def re_inspect():
    try:
        foo()
    except Exception, e:
         # re-inspect traceback and check `a` and `b`

Когда поднимается AssertionError, если я пытаюсь оценить строкутам, где возникает исключение, я (конечно) не могу сказать, что такое a или b (NameError возникает немедленно), потому что мне не хватает контекста кода.

Примечаниечто у меня нет доступа к a и b, так как приведенный выше код импортируется и затем выполняется.Поскольку foo не находится в текущем пространстве имен, моя проблема заключается в получении правильных значений из контекста foo.

Каким будет правильный подход, позволяющий определить, что такое a и b, чтобы вы могли смело сказать что-то вроде: "a - Истина, а be - Ложь"?

1 Ответ

5 голосов
/ 03 марта 2011

Вы можете использовать модуль проверки:

try:
    foo()
except AssertionError, e:
    import inspect
    previous_trace = inspect.trace()[1]
    frame = previous_trace[0]
    print 'value of a, b:', inspect.getargvalues(frame).locals

См. http://docs.python.org/library/inspect.html#inspect.getargvalues

...