import sys
import traceback
from unittest.mock import patch
def dump_stack(detailed_types=(), file=sys.stdout):
def detailed_repr(obj, _repr=repr):
def repr_attributes(obj, indent_level=2):
if isinstance(obj, detailed_types):
seen.add(id(obj))
indent = ' ' * indent_level
for name, value in sorted(vars(obj).items()):
yield f'{indent}.{name} = {value}'
if id(value) not in seen:
yield from repr_attributes(value, indent_level + 1)
seen = set()
return '\n'.join([_repr(obj), *repr_attributes(obj)])
with patch('builtins.repr', detailed_repr):
print(
*traceback.StackSummary.extract(
traceback.walk_stack(sys._getframe(1)), capture_locals=True
).format(), sep='\n', file=file
)
class Foo:
def __init__(self, x, y):
self.bar = Bar(x, y)
self.foo = self
class Bar:
def __init__(self, x, y):
self.x = x
self.y = y
def foo(c):
d = c + 1
dump_stack(detailed_types=(Foo, Bar))
a = 1
b = Foo(2, 3)
foo(a)
aW1wb3J0IHN5cwppbXBvcnQgdHJhY2ViYWNrCmZyb20gdW5pdHRlc3QubW9jayBpbXBvcnQgcGF0Y2gKCmRlZiBkdW1wX3N0YWNrKGRldGFpbGVkX3R5cGVzPSgpLCBmaWxlPXN5cy5zdGRvdXQpOgogICAgZGVmIGRldGFpbGVkX3JlcHIob2JqLCBfcmVwcj1yZXByKToKICAgICAgICBkZWYgcmVwcl9hdHRyaWJ1dGVzKG9iaiwgaW5kZW50X2xldmVsPTIpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgZGV0YWlsZWRfdHlwZXMpOgogICAgICAgICAgICAgICAgc2Vlbi5hZGQoaWQob2JqKSkKICAgICAgICAgICAgICAgIGluZGVudCA9ICcgICAgJyAqIGluZGVudF9sZXZlbAogICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNvcnRlZCh2YXJzKG9iaikuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZid7aW5kZW50fS57bmFtZX0gPSB7dmFsdWV9JwogICAgICAgICAgICAgICAgICAgIGlmIGlkKHZhbHVlKSBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZnJvbSByZXByX2F0dHJpYnV0ZXModmFsdWUsIGluZGVudF9sZXZlbCArIDEpCiAgICAgICAgc2VlbiA9IHNldCgpCiAgICAgICAgcmV0dXJuICdcbicuam9pbihbX3JlcHIob2JqKSwgKnJlcHJfYXR0cmlidXRlcyhvYmopXSkKCiAgICB3aXRoIHBhdGNoKCdidWlsdGlucy5yZXByJywgZGV0YWlsZWRfcmVwcik6CiAgICAgICAgcHJpbnQoCiAgICAgICAgICAgICp0cmFjZWJhY2suU3RhY2tTdW1tYXJ5LmV4dHJhY3QoCiAgICAgICAgICAgICAgICB0cmFjZWJhY2sud2Fsa19zdGFjayhzeXMuX2dldGZyYW1lKDEpKSwgY2FwdHVyZV9sb2NhbHM9VHJ1ZQogICAgICAgICAgICApLmZvcm1hdCgpLCBzZXA9J1xuJywgZmlsZT1maWxlCiAgICAgICAgKQoKY2xhc3MgRm9vOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgogICAgICAgIHNlbGYuYmFyID0gQmFyKHgsIHkpCiAgICAgICAgc2VsZi5mb28gPSBzZWxmCgpjbGFzcyBCYXI6CiAgICBkZWYgX19pbml0X18oc2VsZiwgeCwgeSk6CiAgICAgICAgc2VsZi54ID0geAogICAgICAgIHNlbGYueSA9IHkKCmRlZiBmb28oYyk6CiAgICBkID0gYyArIDEKICAgIGR1bXBfc3RhY2soZGV0YWlsZWRfdHlwZXM9KEZvbywgQmFyKSkKCmEgPSAxCmIgPSBGb28oMiwgMykKZm9vKGEp