summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTian Gao <gaogaotiantian@hotmail.com>2024-03-21 10:30:10 (GMT)
committerGitHub <noreply@github.com>2024-03-21 10:30:10 (GMT)
commitd16c9d1278164f04778861814ebc87ed087511fc (patch)
treef75015b09200282f310af828f79edaa650c3c908
parent6547330f4e896c6748da23704b617e060e6cc68e (diff)
downloadcpython-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.py11
-rw-r--r--Lib/test/test_inspect/inspect_fodder2.py5
-rw-r--r--Lib/test/test_inspect/test_inspect.py3
-rw-r--r--Misc/NEWS.d/next/Library/2024-03-19-19-42-25.gh-issue-116987.ZVKUH1.rst1
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.