diff options
author | Tian Gao <gaogaotiantian@hotmail.com> | 2024-03-21 10:30:10 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-21 10:30:10 (GMT) |
commit | d16c9d1278164f04778861814ebc87ed087511fc (patch) | |
tree | f75015b09200282f310af828f79edaa650c3c908 | |
parent | 6547330f4e896c6748da23704b617e060e6cc68e (diff) | |
download | cpython-d16c9d1278164f04778861814ebc87ed087511fc.zip cpython-d16c9d1278164f04778861814ebc87ed087511fc.tar.gz cpython-d16c9d1278164f04778861814ebc87ed087511fc.tar.bz2 |
gh-116987: Support class code objects in inspect.findsource() (GH-117025)
-rw-r--r-- | Lib/inspect.py | 11 | ||||
-rw-r--r-- | Lib/test/test_inspect/inspect_fodder2.py | 5 | ||||
-rw-r--r-- | Lib/test/test_inspect/test_inspect.py | 3 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2024-03-19-19-42-25.gh-issue-116987.ZVKUH1.rst | 1 |
4 files changed, 11 insertions, 9 deletions
diff --git a/Lib/inspect.py b/Lib/inspect.py index 7336cea..422c09a 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1157,15 +1157,8 @@ def findsource(object): if not hasattr(object, 'co_firstlineno'): raise OSError('could not find function definition') lnum = object.co_firstlineno - 1 - pat = re.compile(r'^(\s*def\s)|(\s*async\s+def\s)|(.*(?<!\w)lambda(:|\s))|^(\s*@)') - while lnum > 0: - try: - line = lines[lnum] - except IndexError: - raise OSError('lineno is out of bounds') - if pat.match(line): - break - lnum = lnum - 1 + if lnum >= len(lines): + raise OSError('lineno is out of bounds') return lines, lnum raise OSError('could not find code object') diff --git a/Lib/test/test_inspect/inspect_fodder2.py b/Lib/test/test_inspect/inspect_fodder2.py index 8639cf2..bb9d3e8 100644 --- a/Lib/test/test_inspect/inspect_fodder2.py +++ b/Lib/test/test_inspect/inspect_fodder2.py @@ -310,3 +310,8 @@ else: class cls310: def g(): pass + +# line 314 +class ClassWithCodeObject: + import sys + code = sys._getframe(0).f_code diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py index 21d9f96..dc46c0b 100644 --- a/Lib/test/test_inspect/test_inspect.py +++ b/Lib/test/test_inspect/test_inspect.py @@ -983,6 +983,9 @@ class TestBuggyCases(GetSourceBase): def test_getsource_on_method(self): self.assertSourceEqual(mod2.ClassWithMethod.method, 118, 119) + def test_getsource_on_class_code_object(self): + self.assertSourceEqual(mod2.ClassWithCodeObject.code, 315, 317) + def test_nested_func(self): self.assertSourceEqual(mod2.cls135.func136, 136, 139) diff --git a/Misc/NEWS.d/next/Library/2024-03-19-19-42-25.gh-issue-116987.ZVKUH1.rst b/Misc/NEWS.d/next/Library/2024-03-19-19-42-25.gh-issue-116987.ZVKUH1.rst new file mode 100644 index 0000000..f2da956 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-03-19-19-42-25.gh-issue-116987.ZVKUH1.rst @@ -0,0 +1 @@ +Fixed :func:`inspect.findsource` for class code objects. |