From a5855d5ace1c1426e1247272c688ccc11ae02f7c Mon Sep 17 00:00:00 2001 From: Johannes Gijsbers Date: Sat, 12 Mar 2005 16:37:11 +0000 Subject: Patch #1159931/bug #1143895: inspect.getsource failed when functions, etc., had comments after the colon, and some other cases. This patch take a simpler approach that doesn't rely on looking for a ':'. Thanks Simon Percivall! --- Lib/inspect.py | 10 +++++----- Lib/test/inspect_fodder2.py | 11 +++++++++++ Lib/test/test_inspect.py | 10 ++++++++++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Lib/inspect.py b/Lib/inspect.py index dd89932..a801a29 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -504,6 +504,7 @@ class BlockFinder: """Provide a tokeneater() method to detect the end of a code block.""" def __init__(self): self.indent = 0 + self.islambda = False self.started = False self.passline = False self.last = 0 @@ -511,11 +512,8 @@ class BlockFinder: def tokeneater(self, type, token, (srow, scol), (erow, ecol), line): if not self.started: if token in ("def", "class", "lambda"): - lastcolon = line.rfind(":") - if lastcolon: - oneline = re.search(r"\w", line[lastcolon:]) - if oneline and line[-2:] != "\\\n": - raise EndOfBlock, srow + if token == "lambda": + self.islambda = True self.started = True self.passline = True elif type == tokenize.NEWLINE: @@ -523,6 +521,8 @@ class BlockFinder: self.last = srow elif self.passline: pass + elif self.islambda: + raise EndOfBlock, self.last elif type == tokenize.INDENT: self.indent = self.indent + 1 self.passline = True diff --git a/Lib/test/inspect_fodder2.py b/Lib/test/inspect_fodder2.py index 44c7572..f216c82 100644 --- a/Lib/test/inspect_fodder2.py +++ b/Lib/test/inspect_fodder2.py @@ -53,3 +53,14 @@ a = [None, def setfunc(func): globals()["anonymous"] = func setfunc(lambda x, y: x*y) + +# line 57 +def with_comment(): # hello + world + +# line 61 +multiline_sig = [ + lambda (x, + y): x+y, + None, + ] diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 9e60a9c..1fb48c5 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -229,6 +229,15 @@ class TestOneliners(GetSourceBase): # as argument to another function. self.assertSourceEqual(mod2.anonymous, 55, 55) +class TestBuggyCases(GetSourceBase): + fodderFile = mod2 + + def test_with_comment(self): + self.assertSourceEqual(mod2.with_comment, 58, 59) + + def test_multiline_sig(self): + self.assertSourceEqual(mod2.multiline_sig[0], 63, 64) + # Helper for testing classify_class_attrs. def attrs_wo_objs(cls): return [t[:3] for t in inspect.classify_class_attrs(cls)] @@ -414,6 +423,7 @@ class TestClassesAndFunctions(unittest.TestCase): def test_main(): run_unittest(TestDecorators, TestRetrievingSourceCode, TestOneliners, + TestBuggyCases, TestInterpreterStack, TestClassesAndFunctions, TestPredicates) if __name__ == "__main__": -- cgit v0.12