diff --git a/pysnooper/tracer.py b/pysnooper/tracer.py index 57c67ee..a2a47bb 100644 --- a/pysnooper/tracer.py +++ b/pysnooper/tracer.py @@ -21,13 +21,14 @@ ipython_filename_pattern = re.compile('^$') def get_local_reprs(frame, watch=()): + var_names = frame.f_code.co_varnames + frame.f_code.co_cellvars result = collections.OrderedDict( (key, utils.get_shortish_repr(frame.f_locals[key])) - for key in frame.f_code.co_varnames if key in frame.f_locals + for key in var_names if key in frame.f_locals ) - result.update(sorted((key, utils.get_shortish_repr(frame.f_locals[key])) - for key in set(frame.f_locals) - set(frame.f_code.co_varnames))) + result.update((key, utils.get_shortish_repr(frame.f_locals[key])) + for key in frame.f_code.co_freevars) for variable in watch: result.update(sorted(variable.items(frame))) diff --git a/tests/test_pysnooper.py b/tests/test_pysnooper.py index e30b696..6f97ebd 100644 --- a/tests/test_pysnooper.py +++ b/tests/test_pysnooper.py @@ -921,6 +921,67 @@ def test_with_block_depth(): ) ) +def test_cellvars(): + string_io = io.StringIO() + + def f2(a): + def f3(a): + x = 0 + x += 1 + def f4(a): + y = x + return 42 + return f4(a) + return f3(a) + + def f1(a): + with pysnooper.snoop(string_io, depth=4): + result1 = f2(a) + return result1 + + result = f1(42) + assert result == 42 + output = string_io.getvalue() + assert_output( + output, + ( + VariableEntry(), + VariableEntry(), + VariableEntry(), + LineEntry('result1 = f2(a)'), + + VariableEntry(), + CallEntry('def f2(a):'), + LineEntry(), + VariableEntry(), + LineEntry(), + + VariableEntry("a"), + CallEntry('def f3(a):'), + LineEntry(), + VariableEntry("x"), + LineEntry(), + VariableEntry("x"), + LineEntry(), + VariableEntry(), + + LineEntry(), + VariableEntry(), + VariableEntry("x"), + CallEntry('def f4(a):'), + LineEntry(), + VariableEntry(), + LineEntry(), + + ReturnEntry(), + ReturnValueEntry(), + ReturnEntry(), + ReturnValueEntry(), + ReturnEntry(), + ReturnValueEntry(), + ) + ) + def test_truncate(): max_length = 20