Как получить значение аргументов, переданных функциям в стеке?

С использованием:

traceback.print_stack()

Я могу получить:

  File "x.py", line 20, in <module>
    y(x)
  File "x.py", line 11, in y
    fun(x)
  File "x.py", line 8, in fun
    traceback.print_stack()

У меня есть способ получить что-то вроде этого:

  File "x.py", line 20, in <module>
    y(x) WHERE x == 1
  File "x.py", line 11, in y
    fun(x) WHERE x == 'str'
  File "x.py", line 8, in fun
    traceback.print_stack()

Я просто хочу посмотреть, какие аргументы были переданы функциям.


person Adam    schedule 19.05.2011    source источник
comment
Python должен был бы сохранять эти прошлые значения всякий раз, когда он вызывает функцию, поэтому я так не думаю. Если вы просто пытаетесь отладить, используйте настоящий отладчик или запишите значения.   -  person Jochen Ritzel    schedule 19.05.2011
comment
@Jochen: Я думаю, что Python сохраняет значения, поскольку трассировка ссылается на фрейм, поэтому фрейм не собирается сборщиком мусора.   -  person Sven Marnach    schedule 19.05.2011
comment
@Jochen: Я не пытаюсь отлаживать. Я просто хочу занести эту информацию в лог. Чтобы получить больше информации об этом, мне нужно отладить.   -  person Adam    schedule 19.05.2011
comment
@Adam Пожалуйста, опубликуйте свое решение в качестве ответа, не включайте его в вопрос. Я удалил его, но вы можете получить к нему доступ в истории изменений: stackoverflow.com/posts/6061744/revisions   -  person BartoszKP    schedule 04.05.2015


Ответы (2)


Вероятно, вы сможете что-то подстроить, используя inspect.getargvalues() и получив доступ к фрейму стека, принадлежащему к вашей трассировке:

 inspect.getargvalues(traceback.tb_frame)

Вам нужно будет поработать, чтобы получить именно тот результат, который вам нужен. Вышеупомянутая строка предназначена только для самого внутреннего кадра, поэтому вам придется подняться по стеку и получить доступ к информации, необходимой для каждого кадра. inspect.getouterframes() может пригодиться.

person Sven Marnach    schedule 19.05.2011

Для этого можно использовать модуль inspect:

>>> import inspect
... def fn(x):
...     try:
...         print(1/0)
...     except ZeroDivisionError as e:
...         frames = inspect.trace()
...         argvalues = inspect.getargvalues(frames[0][0])
...         print("Argvalues: ", inspect.formatargvalues(*argvalues))
>>> fn(12)
Argvalues:  (x=12)
person Tim Lesher    schedule 19.05.2011