Skip to content

Commit

Permalink
gh-105013: Fix inspect.getsource with parenthesized multiline lambdas (
Browse files Browse the repository at this point in the history
  • Loading branch information
pablogsal committed May 27, 2023
1 parent b225c08 commit 3a5be87
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix handling of multiline parenthesized lambdas in
:func:`inspect.getsource`. Patch by Pablo Galindo

0 comments on commit 3a5be87

Please sign in to comment.