Skip to content

Commit

Permalink
[3.12] gh-105013: Fix inspect.getsource with parenthesized multiline …
Browse files Browse the repository at this point in the history
…lambdas (GH-105021) (#105032)

gh-105013: Fix inspect.getsource with parenthesized multiline lambdas (GH-105021)
(cherry picked from commit 3a5be87)

Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
  • Loading branch information
miss-islington and pablogsal committed May 28, 2023
1 parent 36a4227 commit 41b622b
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 0 deletions.
8 changes: 8 additions & 0 deletions Lib/inspect.py
Expand Up @@ -1242,6 +1242,14 @@ def getblock(lines):
blockfinder.tokeneater(*_token)
except (EndOfBlock, IndentationError):
pass
except SyntaxError as e:
if "unmatched" not in e.msg:
raise e from None
_, *_token_info = _token
try:
blockfinder.tokeneater(tokenize.NEWLINE, *_token_info)
except (EndOfBlock, IndentationError):
pass
return lines[:blockfinder.last]

def getsourcelines(object):
Expand Down
17 changes: 17 additions & 0 deletions Lib/test/inspect_fodder2.py
Expand Up @@ -273,3 +273,20 @@ def wrapper(*a, **kwd):
@deco_factory(foo=(1 + 2), bar=lambda: 1)
def complex_decorated(foo=0, bar=lambda: 0):
return foo + bar()

# line 276
parenthesized_lambda = (
lambda: ())
parenthesized_lambda2 = [
lambda: ()][0]
parenthesized_lambda3 = {0:
lambda: ()}[0]

# line 285
post_line_parenthesized_lambda1 = (lambda: ()
)

# line 289
nested_lambda = (
lambda right: [].map(
lambda length: ()))
16 changes: 16 additions & 0 deletions Lib/test/test_inspect.py
Expand Up @@ -776,6 +776,22 @@ def test_twoline_indented_lambda(self):
# where the second line _is_ indented.
self.assertSourceEqual(mod2.tlli, 33, 34)

def test_parenthesized_multiline_lambda(self):
# Test inspect.getsource with a parenthesized multi-line lambda
# function.
self.assertSourceEqual(mod2.parenthesized_lambda, 279, 279)
self.assertSourceEqual(mod2.parenthesized_lambda2, 281, 281)
self.assertSourceEqual(mod2.parenthesized_lambda3, 283, 283)

def test_post_line_parenthesized_lambda(self):
# Test inspect.getsource with a parenthesized multi-line lambda
# function.
self.assertSourceEqual(mod2.post_line_parenthesized_lambda1, 286, 287)

def test_nested_lambda(self):
# Test inspect.getsource with a nested lambda function.
self.assertSourceEqual(mod2.nested_lambda, 291, 292)

def test_onelinefunc(self):
# Test inspect.getsource with a regular one-line function.
self.assertSourceEqual(mod2.onelinefunc, 37, 37)
Expand Down
@@ -0,0 +1,2 @@
Fix handling of multiline parenthesized lambdas in
:func:`inspect.getsource`. Patch by Pablo Galindo

0 comments on commit 41b622b

Please sign in to comment.