From 75b3fe6c598fca96d7c7a23385939acf06c1b34e Mon Sep 17 00:00:00 2001 From: furkanonder Date: Wed, 25 Jan 2023 17:18:42 +0300 Subject: [PATCH 1/5] Fix inspect.getargvalues fails if arg name is not bound to a value --- Lib/inspect.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Lib/inspect.py b/Lib/inspect.py index 8bb3a375735af6..d29910942f4077 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1462,6 +1462,14 @@ def _formatannotation(annotation): return formatannotation(annotation, module) return _formatannotation +# A placeholder with as repr (using a string would have '' +# with quotes). This is used in formatargvalues function. +class _Deleted: + def __repr__(self): + return '' + +_deleted = _Deleted() +del _Deleted def formatargvalues(args, varargs, varkw, locals, formatarg=str, @@ -1476,7 +1484,7 @@ def formatargvalues(args, varargs, varkw, locals, argument is an optional function to format the sequence of arguments.""" def convert(name, locals=locals, formatarg=formatarg, formatvalue=formatvalue): - return formatarg(name) + formatvalue(locals[name]) + return formatarg(name) + formatvalue(locals.get(name, _deleted)) specs = [] for i in range(len(args)): specs.append(convert(args[i])) From 6c59a29275dbc82d55bd5c9c3be814fe249ca828 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Thu, 26 Jan 2023 09:36:27 +0000 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Library/2023-01-26-09-36-24.gh-issue-61448.SOAkvt.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2023-01-26-09-36-24.gh-issue-61448.SOAkvt.rst diff --git a/Misc/NEWS.d/next/Library/2023-01-26-09-36-24.gh-issue-61448.SOAkvt.rst b/Misc/NEWS.d/next/Library/2023-01-26-09-36-24.gh-issue-61448.SOAkvt.rst new file mode 100644 index 00000000000000..c8c1dd3947810e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-01-26-09-36-24.gh-issue-61448.SOAkvt.rst @@ -0,0 +1 @@ +Fix inspect.getargvalues function failing if arg name is not bound to a value. From 0afa69ae8a69f185b907414924bb94f4334dc366 Mon Sep 17 00:00:00 2001 From: furkanonder Date: Fri, 31 Mar 2023 00:54:38 +0300 Subject: [PATCH 3/5] Add testcases for function arguments --- Lib/test/test_inspect.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 92aba519d28a08..cd1a20cbe475b2 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -477,6 +477,20 @@ def test_frame(self): self.assertEqual(inspect.formatargvalues(args, varargs, varkw, locals), '(x=11, y=14)') + def return_current_frame(x): + return inspect.currentframe() + + self.assertEqual(inspect.formatargvalues(*inspect.getargvalues(return_current_frame(5))), "(x=5)") + self.assertEqual(inspect.formatargvalues(*inspect.getargvalues(return_current_frame(9))), "(x=9)") + + # See issue-61448 + def delete_arg(x): + del x + return inspect.currentframe() + + self.assertEqual(inspect.formatargvalues(*inspect.getargvalues(delete_arg(10))), "(x=)") + self.assertEqual(inspect.formatargvalues(*inspect.getargvalues(delete_arg(4))), "(x=)") + def test_previous_frame(self): args, varargs, varkw, locals = inspect.getargvalues(mod.fr.f_back) self.assertEqual(args, ['a', 'b', 'c', 'd', 'e', 'f']) From 35a9cecf43365452a83981b48ccf9e8caad3d74e Mon Sep 17 00:00:00 2001 From: furkanonder Date: Fri, 31 Mar 2023 01:02:08 +0300 Subject: [PATCH 4/5] Add testcase for formatargvalues function --- Lib/test/test_inspect.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index cd1a20cbe475b2..40c72cc7b2166f 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -483,13 +483,14 @@ def return_current_frame(x): self.assertEqual(inspect.formatargvalues(*inspect.getargvalues(return_current_frame(5))), "(x=5)") self.assertEqual(inspect.formatargvalues(*inspect.getargvalues(return_current_frame(9))), "(x=9)") - # See issue-61448 - def delete_arg(x): - del x + # See issue-61448 + def test_formatargvalues_deleted_args(self): + def fun(a, b, x, y): + del b, y return inspect.currentframe() - self.assertEqual(inspect.formatargvalues(*inspect.getargvalues(delete_arg(10))), "(x=)") - self.assertEqual(inspect.formatargvalues(*inspect.getargvalues(delete_arg(4))), "(x=)") + args = inspect.getargvalues(fun(2, 4, 8, 16)) + self.assertEqual(inspect.formatargvalues(*args), '(a=2, b=, x=8, y=)') def test_previous_frame(self): args, varargs, varkw, locals = inspect.getargvalues(mod.fr.f_back) From dd8a14ada9d7cebb77bab7cba1e7ca35930e08f7 Mon Sep 17 00:00:00 2001 From: Furkan Onder Date: Fri, 31 Mar 2023 01:05:48 +0300 Subject: [PATCH 5/5] Mention the co-author --- .../next/Library/2023-01-26-09-36-24.gh-issue-61448.SOAkvt.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/Misc/NEWS.d/next/Library/2023-01-26-09-36-24.gh-issue-61448.SOAkvt.rst b/Misc/NEWS.d/next/Library/2023-01-26-09-36-24.gh-issue-61448.SOAkvt.rst index c8c1dd3947810e..2c64d08b0e4b09 100644 --- a/Misc/NEWS.d/next/Library/2023-01-26-09-36-24.gh-issue-61448.SOAkvt.rst +++ b/Misc/NEWS.d/next/Library/2023-01-26-09-36-24.gh-issue-61448.SOAkvt.rst @@ -1 +1,2 @@ Fix inspect.getargvalues function failing if arg name is not bound to a value. +Co-authored-by Ezio Melotti.