From: Georg Brandl Date: Thu, 12 Oct 2006 09:20:36 +0000 (+0000) Subject: Bug #1550524: better heuristics to find correct class definition X-Git-Tag: v2.5.1c1~329 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fcf6696255b36efd73745d4e5e8e9a1dcbd2fd40;p=thirdparty%2FPython%2Fcpython.git Bug #1550524: better heuristics to find correct class definition in inspect.findsource(). (backport from rev. 52299) --- diff --git a/Lib/inspect.py b/Lib/inspect.py index ba2021ab949e..986a415e2c51 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')