Skip to content

Commit

Permalink
[3.11] gh-107155: Fix help() for lambda function with return annotati…
Browse files Browse the repository at this point in the history
…on (GH-115613)

(cherry picked from commit b9a9e3d)
  • Loading branch information
Eclips4 committed Feb 17, 2024
1 parent a23aecc commit ee3d8dc
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 2 deletions.
6 changes: 4 additions & 2 deletions Lib/pydoc.py
Expand Up @@ -1128,7 +1128,8 @@ def docroutine(self, object, name=None, mod=None,
# XXX lambda's won't usually have func_annotations['return']
# since the syntax doesn't support but it is possible.
# So removing parentheses isn't truly safe.
argspec = argspec[1:-1] # remove parentheses
if not object.__annotations__:
argspec = argspec[1:-1] # remove parentheses
if not argspec:
argspec = '(...)'

Expand Down Expand Up @@ -1581,7 +1582,8 @@ def docroutine(self, object, name=None, mod=None, cl=None, homecls=None):
# XXX lambda's won't usually have func_annotations['return']
# since the syntax doesn't support but it is possible.
# So removing parentheses isn't truly safe.
argspec = argspec[1:-1] # remove parentheses
if not object.__annotations__:
argspec = argspec[1:-1] # remove parentheses
if not argspec:
argspec = '(...)'
decl = asyncqualifier + title + argspec + note
Expand Down
24 changes: 24 additions & 0 deletions Lib/test/test_pydoc/test_pydoc.py
Expand Up @@ -691,6 +691,30 @@ def test_help_output_redirect(self):
finally:
pydoc.getpager = getpager_old

def test_lambda_with_return_annotation(self):
func = lambda a, b, c: 1
func.__annotations__ = {"return": int}
with captured_output('stdout') as help_io:
pydoc.help(func)
helptext = help_io.getvalue()
self.assertIn("lambda (a, b, c) -> int", helptext)

def test_lambda_without_return_annotation(self):
func = lambda a, b, c: 1
func.__annotations__ = {"a": int, "b": int, "c": int}
with captured_output('stdout') as help_io:
pydoc.help(func)
helptext = help_io.getvalue()
self.assertIn("lambda (a: int, b: int, c: int)", helptext)

def test_lambda_with_return_and_params_annotation(self):
func = lambda a, b, c: 1
func.__annotations__ = {"a": int, "b": int, "c": int, "return": int}
with captured_output('stdout') as help_io:
pydoc.help(func)
helptext = help_io.getvalue()
self.assertIn("lambda (a: int, b: int, c: int) -> int", helptext)

def test_namedtuple_fields(self):
Person = namedtuple('Person', ['nickname', 'firstname'])
with captured_stdout() as help_io:
Expand Down
@@ -0,0 +1,3 @@
Fix incorrect output of ``help(x)`` where ``x`` is a :keyword:`lambda`
function, which has an ``__annotations__`` dictionary attribute with a
``"return"`` key.

0 comments on commit ee3d8dc

Please sign in to comment.