Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion Lib/inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -1462,6 +1462,14 @@ def _formatannotation(annotation):
return formatannotation(annotation, module)
return _formatannotation

# A placeholder with <deleted> as repr (using a string would have '<deleted>'
# with quotes). This is used in formatargvalues function.
class _Deleted:
def __repr__(self):
return '<deleted>'

_deleted = _Deleted()
del _Deleted

def formatargvalues(args, varargs, varkw, locals,
formatarg=str,
Expand All @@ -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]))
Expand Down
15 changes: 15 additions & 0 deletions Lib/test/test_inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -477,6 +477,21 @@ 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 test_formatargvalues_deleted_args(self):
def fun(a, b, x, y):
del b, y
return inspect.currentframe()

args = inspect.getargvalues(fun(2, 4, 8, 16))
self.assertEqual(inspect.formatargvalues(*args), '(a=2, b=<deleted>, x=8, y=<deleted>)')

def test_previous_frame(self):
args, varargs, varkw, locals = inspect.getargvalues(mod.fr.f_back)
self.assertEqual(args, ['a', 'b', 'c', 'd', 'e', 'f'])
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix inspect.getargvalues function failing if arg name is not bound to a value.
Co-authored-by Ezio Melotti.