summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-05-28 11:18:43 (GMT)
committerGitHub <noreply@github.com>2023-05-28 11:18:43 (GMT)
commit41b622b1e8736bd86c8dc2e1471121d5f6a88937 (patch)
tree121c65aa17193991fb1626cbadc93d6c18f009c5
parent36a4227859fe4cb5a3ad79ea6da99b4d8b405a8d (diff)
downloadcpython-41b622b1e8736bd86c8dc2e1471121d5f6a88937.zip
cpython-41b622b1e8736bd86c8dc2e1471121d5f6a88937.tar.gz
cpython-41b622b1e8736bd86c8dc2e1471121d5f6a88937.tar.bz2
[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 3a5be878be6f89ee98d0ef9a1274e6a9d9ccbc37) Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
-rw-r--r--Lib/inspect.py8
-rw-r--r--Lib/test/inspect_fodder2.py17
-rw-r--r--Lib/test/test_inspect.py16
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2023-05-27-16-57-11.gh-issue-105013.IsDgDY.rst2
4 files changed, 43 insertions, 0 deletions
diff --git a/Lib/inspect.py b/Lib/inspect.py
index 7709a95..55530fc 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -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):
diff --git a/Lib/test/inspect_fodder2.py b/Lib/test/inspect_fodder2.py
index 2dc4981..0346461 100644
--- a/Lib/test/inspect_fodder2.py
+++ b/Lib/test/inspect_fodder2.py
@@ -273,3 +273,20 @@ def deco_factory(**kwargs):
@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: ()))
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index ade3215..a7bd680 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -776,6 +776,22 @@ class TestOneliners(GetSourceBase):
# 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)
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-05-27-16-57-11.gh-issue-105013.IsDgDY.rst b/Misc/NEWS.d/next/Core and Builtins/2023-05-27-16-57-11.gh-issue-105013.IsDgDY.rst
new file mode 100644
index 0000000..a9917c2
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2023-05-27-16-57-11.gh-issue-105013.IsDgDY.rst
@@ -0,0 +1,2 @@
+Fix handling of multiline parenthesized lambdas in
+:func:`inspect.getsource`. Patch by Pablo Galindo