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!
This commit is contained in:
parent
f77d0334f3
commit
a5855d5ace
|
@ -504,6 +504,7 @@ class BlockFinder:
|
||||||
"""Provide a tokeneater() method to detect the end of a code block."""
|
"""Provide a tokeneater() method to detect the end of a code block."""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.indent = 0
|
self.indent = 0
|
||||||
|
self.islambda = False
|
||||||
self.started = False
|
self.started = False
|
||||||
self.passline = False
|
self.passline = False
|
||||||
self.last = 0
|
self.last = 0
|
||||||
|
@ -511,11 +512,8 @@ class BlockFinder:
|
||||||
def tokeneater(self, type, token, (srow, scol), (erow, ecol), line):
|
def tokeneater(self, type, token, (srow, scol), (erow, ecol), line):
|
||||||
if not self.started:
|
if not self.started:
|
||||||
if token in ("def", "class", "lambda"):
|
if token in ("def", "class", "lambda"):
|
||||||
lastcolon = line.rfind(":")
|
if token == "lambda":
|
||||||
if lastcolon:
|
self.islambda = True
|
||||||
oneline = re.search(r"\w", line[lastcolon:])
|
|
||||||
if oneline and line[-2:] != "\\\n":
|
|
||||||
raise EndOfBlock, srow
|
|
||||||
self.started = True
|
self.started = True
|
||||||
self.passline = True
|
self.passline = True
|
||||||
elif type == tokenize.NEWLINE:
|
elif type == tokenize.NEWLINE:
|
||||||
|
@ -523,6 +521,8 @@ class BlockFinder:
|
||||||
self.last = srow
|
self.last = srow
|
||||||
elif self.passline:
|
elif self.passline:
|
||||||
pass
|
pass
|
||||||
|
elif self.islambda:
|
||||||
|
raise EndOfBlock, self.last
|
||||||
elif type == tokenize.INDENT:
|
elif type == tokenize.INDENT:
|
||||||
self.indent = self.indent + 1
|
self.indent = self.indent + 1
|
||||||
self.passline = True
|
self.passline = True
|
||||||
|
|
|
@ -53,3 +53,14 @@ a = [None,
|
||||||
def setfunc(func):
|
def setfunc(func):
|
||||||
globals()["anonymous"] = func
|
globals()["anonymous"] = func
|
||||||
setfunc(lambda x, y: x*y)
|
setfunc(lambda x, y: x*y)
|
||||||
|
|
||||||
|
# line 57
|
||||||
|
def with_comment(): # hello
|
||||||
|
world
|
||||||
|
|
||||||
|
# line 61
|
||||||
|
multiline_sig = [
|
||||||
|
lambda (x,
|
||||||
|
y): x+y,
|
||||||
|
None,
|
||||||
|
]
|
||||||
|
|
|
@ -229,6 +229,15 @@ class TestOneliners(GetSourceBase):
|
||||||
# as argument to another function.
|
# as argument to another function.
|
||||||
self.assertSourceEqual(mod2.anonymous, 55, 55)
|
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.
|
# Helper for testing classify_class_attrs.
|
||||||
def attrs_wo_objs(cls):
|
def attrs_wo_objs(cls):
|
||||||
return [t[:3] for t in inspect.classify_class_attrs(cls)]
|
return [t[:3] for t in inspect.classify_class_attrs(cls)]
|
||||||
|
@ -414,6 +423,7 @@ class TestClassesAndFunctions(unittest.TestCase):
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
run_unittest(TestDecorators, TestRetrievingSourceCode, TestOneliners,
|
run_unittest(TestDecorators, TestRetrievingSourceCode, TestOneliners,
|
||||||
|
TestBuggyCases,
|
||||||
TestInterpreterStack, TestClassesAndFunctions, TestPredicates)
|
TestInterpreterStack, TestClassesAndFunctions, TestPredicates)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
Loading…
Reference in New Issue