From ff84fb3f3c775f955de3355355058c2c2e65d242 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Fri, 9 Aug 2019 17:11:32 +0200 Subject: [PATCH] bpo-21161: pdb: default: handle list comprehensions Fixes https://bugs.python.org/issue21161. --- Lib/pdb.py | 5 +++-- Lib/test/test_pdb.py | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Lib/pdb.py b/Lib/pdb.py index 69fd8bd6efb0e5..16768cd697a9b3 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -362,7 +362,8 @@ def displayhook(self, obj): def default(self, line): if line[:1] == '!': line = line[1:] locals = self.curframe_locals - globals = self.curframe.f_globals + ns = self.curframe.f_globals.copy() + ns.update(locals) try: code = compile(line + '\n', '', 'single') save_stdout = sys.stdout @@ -372,7 +373,7 @@ def default(self, line): sys.stdin = self.stdin sys.stdout = self.stdout sys.displayhook = self.displayhook - exec(code, globals, locals) + exec(code, ns, locals) finally: sys.stdout = save_stdout sys.stdin = save_stdin diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 646bdb16e53b9f..d14ab0e9dcf4ab 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -1562,6 +1562,32 @@ def test_errors_in_command(self): '(Pdb) ', ]) + def test_list_comprehensions(self): + script = """ + def f(): + mylocal = "init_mylocal" # noqa: F841 + import pdb; pdb.Pdb(readrc=False).set_trace() + print("SUCCESS") + + f() + """ + commands = """ + continue + + p "mylocal:" + mylocal + ["mylocal_1:%s" % mylocal for x in range(1)] + mylocal = 42 + ["mylocal_2:%s" % mylocal for x in range(1)] + + continue + """ + stdout, stderr = self.run_pdb_module(script, commands) + lines = stdout.splitlines() + self.assertTrue(any("['mylocal_1:init_mylocal']" in l for l in lines), stdout) + self.assertTrue(any("['mylocal_2:42']" in l for l in lines), stdout) + self.assertTrue(all("NameError" not in l for l in lines), stdout) + self.assertTrue(any("SUCCESS" in l for l in lines), stdout) + def load_tests(*args): from test import test_pdb suites = [