From: Georg Brandl Date: Thu, 12 Oct 2006 09:20:33 +0000 (+0000) Subject: Bug #1550524: better heuristics to find correct class definition X-Git-Tag: v2.6a1~2576 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b2e81e307dc7e7d8a552619b6defddb06e028613;p=python Bug #1550524: better heuristics to find correct class definition in inspect.findsource(). --- 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')