Python 将参数值打印到堆栈跟踪中的函数

Python 将参数值打印到堆栈跟踪中的函数,python,debugging,stack-trace,Python,Debugging,Stack Trace,打印错误堆栈跟踪时,如何打印传递给调用堆栈中函数的参数值?我希望输出与下面的示例完全相同 例如: Traceback (most recent call last): File "./file.py", line 615, in func0 **(arg0) arg0 = 0 was passed** result = func1(arg1, arg2) File "./file.py", line 728, in func1 **(arg1, arg2) arg1 = 1 an

打印错误堆栈跟踪时,如何打印传递给调用堆栈中函数的参数值?我希望输出与下面的示例完全相同

例如:

Traceback (most recent call last):
  File "./file.py", line 615, in func0 **(arg0) arg0 = 0 was passed**
    result = func1(arg1, arg2)
  File "./file.py", line 728, in func1 **(arg1, arg2) arg1 = 1 and arg2 = 2 was passed**
    return int_value[25]
TypeError: 'int' object is not iterable
除了堆栈跟踪中的正常输出外,我还希望打印上面****s中的信息。我设想的是调试器也会自动打印传递的参数。这将清楚地描述数据通过的“功能管道”,以及在管道中发生了什么,哪些功能没有完成它应该做的事情。这将大大有助于调试

我搜索了很多,发现了以下相关问题:

但是这两个问题的答案对我都不起作用:第一个问题的答案导致
ModuleNotFoundError:没有名为“stackdump”的模块
。第二个问题的答案使我的
ipython
解释器崩溃,堆栈跟踪非常长

我也查了一下:


对于
TracebackException
s,似乎有一个
capture\u locals
变量,但我不太明白如何使其工作。

可能存在更好的替代方案,但您可以使用装饰器来实现此目的:

def print_stack_arguments(func):
    def new_func(*original_args, **original_kwargs):
        try:
            return func(*original_args, **original_kwargs)
        except Exception as e:
            print('Function: ', func.__name__)
            print('Args: ', original_args)
            print('Kwargs: ', original_kwargs)
            print(e)
            raise
    return new_func


@print_stack_arguments
def print_error(value):
    a = []
    print(a[1])


@print_stack_arguments
def print_noerror(value):
    print('No exception raised')


print_noerror('testing no exception')
print_error('testing exception')
纯蟒蛇3 谈到
TracebackExceptions
和它的
capture\u locals
参数,我们可以如下使用它:

#/usr/bin/env蟒蛇3
导入回溯
c=['救救我!']
def巴(a=3):
d={1,2,3}
e={}
傅(甲)
def foo(a=4):
b=4
如果是b:
引发异常(“a不等于4”)
尝试:
酒吧(3)
例外情况除外,例如:
tb=traceback.TracebackException.from_异常(例如,capture_locals=True)
打印(“.join(tb.format()))
打印每个帧的所有局部变量:

$ ./test.py 
Traceback (most recent call last):
  File "./test.py", line 21, in <module>
    bar(3)
    __annotations__ = {}
    __builtins__ = <module 'builtins' (built-in)>
    __cached__ = None
    __doc__ = None
    __file__ = './test.py'
    __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x7f81073704c0>
    __name__ = '__main__'
    __package__ = None
    __spec__ = None
    bar = <function bar at 0x7f81073b11f0>
    c = ['Help me!']
    ex = Exception('a is not equal to 4')
    foo = <function foo at 0x7f810728a160>
    traceback = <module 'traceback' from '/usr/lib/python3.8/traceback.py'>
  File "./test.py", line 11, in bar
    foo(a)
    a = 3
    d = {1, 2, 3}
    e = {}
  File "./test.py", line 17, in foo
    raise Exception("a is not equal to 4")
    a = 3
    b = 4
Exception: a is not equal to 4
$。/test.py
回溯(最近一次呼叫最后一次):
文件“/test.py”,第21行,在
酒吧(3)
__注释{{}
__内置的
__缓存的\无
__doc_uu;=无
__文件\ \='./test.py'
__加载器\uuuu=
__名称uuu='uuuu main uuuuuuu'
__包\无
__规格=无
杆=
c=['救救我!']
ex=异常('a不等于4')
foo=
回溯=
文件“/test.py”,第11行,条形图
傅(甲)
a=3
d={1,2,3}
e={}
文件“/test.py”,第17行,在foo中
引发异常(“a不等于4”)
a=3
b=4
例外情况:a不等于4
看起来有点过于冗长,但有时这些数据在调试某些崩溃时可能非常重要

洛古鲁 还有一个打印“”的包:

2018-07-17 01:38:43.975 |错误| | | | |主| |:嵌套:10-什么?!
回溯(最近一次呼叫最后一次):
文件“test.py”,第12行,在
嵌套(0)
└ 
>文件“test.py”,第8行,嵌套
func(5,c)
│       └ 0
└ 
文件“test.py”,第4行,在func中
返回a/b
│   └ 0
└ 5.
ZeroDivision错误:被零除

“不适合我”需要解释。不要使用

格式化文本。正确使用标记在适当的地方插入换行符。谢谢!但是这个装饰器最终会在执行
print\u error
时一直执行。我只希望在打印错误堆栈跟踪时打印信息。我认为最好的方法是修改堆栈跟踪输出以包含参数的值。我能不能进一步改进这个问题来说明这一点?更新了装饰师。现在它只在出现错误时打印。谢谢,这很有用。但是我仍然需要更新我的代码来装饰每一个函数。我设想的是调试器也会自动打印传递的参数。这将清楚地描述数据通过的“功能管道”,以及管道中发生了什么,哪个功能出了问题。这将大大有助于调试。谢谢你的意见,它帮助我澄清了这个问题。
2018-07-17 01:38:43.975 | ERROR    | __main__:nested:10 - What?!
Traceback (most recent call last):

  File "test.py", line 12, in <module>
    nested(0)
    └ <function nested at 0x7f5c755322f0>

> File "test.py", line 8, in nested
    func(5, c)
    │       └ 0
    └ <function func at 0x7f5c79fc2e18>

  File "test.py", line 4, in func
    return a / b
           │   └ 0
           └ 5

ZeroDivisionError: division by zero