From fcf6696255b36efd73745d4e5e8e9a1dcbd2fd40 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Thu, 12 Oct 2006 09:20:36 +0000 Subject: [PATCH] Bug #1550524: better heuristics to find correct class definition in inspect.findsource(). (backport from rev. 52299) --- Lib/inspect.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Lib/inspect.py b/Lib/inspect.py index ba2021ab94..986a415e2c 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -472,9 +472,24 @@ def findsource(object): if isclass(object): name = object.__name__ - pat = re.compile(r'^\s*class\s*' + name + r'\b') + pat = re.compile(r'^(\s*)class\s*' + name + r'\b') + # make some effort to find the best matching class definition: + # use the one with the least indentation, which is the one + # that's most probably not inside a function definition. + candidates = [] for i in range(len(lines)): - if pat.match(lines[i]): return lines, i + match = pat.match(lines[i]) + if match: + # if it's at toplevel, it's already the best one + if lines[i][0] == 'c': + return lines, i + # else add whitespace to candidate list + candidates.append((match.group(1), i)) + if candidates: + # this will sort by whitespace, and by line number, + # less whitespace first + candidates.sort() + return lines, candidates[0][1] else: raise IOError('could not find class definition') -- 2.40.0