Bug #1550524: better heuristics to find correct class definition

in inspect.findsource().
 (backport from rev. 52299)
This commit is contained in:
Georg Brandl 2006-10-12 09:20:36 +00:00
parent 8984370c06
commit fcf6696255
1 changed files with 17 additions and 2 deletions

View File

@ -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')