2011-05-19 96 views
12

使用:如何獲取傳遞給棧上函數的參數的值?

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() 

我只是想看看被傳遞給函數的哪些參數。

+0

Python中必須存儲時,它調用的函數,這些過去的值,所以我不這麼認爲。如果你只是想調試,然後使用一個真正的調試器或記錄值。 – 2011-05-19 16:30:08

+1

@Jochen:我認爲Python確實存儲了值,因爲回溯引用了框架,所以框架不會被垃圾回收。 – 2011-05-19 16:32:25

+0

@Jochen:我沒有試圖去調試。我只想把這些信息記錄下來。有關於我需要調試的更多信息。 – Adam 2011-05-19 16:54:26

回答

10

你或許可以鑽機的東西了使用inspect.getargvalues()和訪問屬於您的回溯棧幀:

inspect.getargvalues(traceback.tb_frame) 

你必須做一些工作,根據需要準確地得到輸出。上面的行只針對最裏面的幀,所以你必須走棧並訪問每幀需要的信息。 inspect.getouterframes()可能派上用場。

9

可以使用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) 
+0

看起來比我的代碼更好。謝謝! – Adam 2011-05-19 16:45:20

相關問題