mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
[3.12] gh-105013: Fix inspect.getsource with parenthesized multiline lambdas (GH-105021) (#105032)
gh-105013: Fix inspect.getsource with parenthesized multiline lambdas (GH-105021)
(cherry picked from commit 3a5be878be
)
Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
This commit is contained in:
parent
36a4227859
commit
41b622b1e8
4 changed files with 43 additions and 0 deletions
|
@ -1242,6 +1242,14 @@ def getblock(lines):
|
||||||
blockfinder.tokeneater(*_token)
|
blockfinder.tokeneater(*_token)
|
||||||
except (EndOfBlock, IndentationError):
|
except (EndOfBlock, IndentationError):
|
||||||
pass
|
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]
|
return lines[:blockfinder.last]
|
||||||
|
|
||||||
def getsourcelines(object):
|
def getsourcelines(object):
|
||||||
|
|
|
@ -273,3 +273,20 @@ def deco_factory(**kwargs):
|
||||||
@deco_factory(foo=(1 + 2), bar=lambda: 1)
|
@deco_factory(foo=(1 + 2), bar=lambda: 1)
|
||||||
def complex_decorated(foo=0, bar=lambda: 0):
|
def complex_decorated(foo=0, bar=lambda: 0):
|
||||||
return foo + bar()
|
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: ()))
|
||||||
|
|
|
@ -776,6 +776,22 @@ class TestOneliners(GetSourceBase):
|
||||||
# where the second line _is_ indented.
|
# where the second line _is_ indented.
|
||||||
self.assertSourceEqual(mod2.tlli, 33, 34)
|
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):
|
def test_onelinefunc(self):
|
||||||
# Test inspect.getsource with a regular one-line function.
|
# Test inspect.getsource with a regular one-line function.
|
||||||
self.assertSourceEqual(mod2.onelinefunc, 37, 37)
|
self.assertSourceEqual(mod2.onelinefunc, 37, 37)
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix handling of multiline parenthesized lambdas in
|
||||||
|
:func:`inspect.getsource`. Patch by Pablo Galindo
|
Loading…
Add table
Add a link
Reference in a new issue