summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTian Gao <gaogaotiantian@hotmail.com>2023-07-24 20:12:45 (GMT)
committerGitHub <noreply@github.com>2023-07-24 20:12:45 (GMT)
commitb38370349139e06f3a44150943ee44e345567d77 (patch)
treeb1914966e580a864ba4a6e1aaa5aeebe31ae805a
parent8ebc9fc321ba1eeb3282c2170f351c54956893e6 (diff)
downloadcpython-b38370349139e06f3a44150943ee44e345567d77.zip
cpython-b38370349139e06f3a44150943ee44e345567d77.tar.gz
cpython-b38370349139e06f3a44150943ee44e345567d77.tar.bz2
gh-106727: Add `__module__` check for `inspect.getsource(cls)` (#106968)
-rw-r--r--Lib/inspect.py3
-rw-r--r--Lib/test/test_inspect.py28
2 files changed, 30 insertions, 1 deletions
diff --git a/Lib/inspect.py b/Lib/inspect.py
index 675714d..c821183 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -1078,7 +1078,8 @@ class _ClassFinder(ast.NodeVisitor):
# First, let's see if there are any method definitions
for member in self.cls.__dict__.values():
- if isinstance(member, types.FunctionType):
+ if (isinstance(member, types.FunctionType) and
+ member.__module__ == self.cls.__module__):
for lineno, end_lineno in self.lineno_found:
if lineno <= member.__code__.co_firstlineno <= end_lineno:
return lineno
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index 33a593f..3fbfc07 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -15,6 +15,7 @@ import pickle
import shutil
import sys
import types
+import tempfile
import textwrap
import unicodedata
import unittest
@@ -963,6 +964,33 @@ class TestBuggyCases(GetSourceBase):
self.assertSourceEqual(mod2.cls213, 218, 222)
self.assertSourceEqual(mod2.cls213().func219(), 220, 221)
+ def test_class_with_method_from_other_module(self):
+ with tempfile.TemporaryDirectory() as tempdir:
+ with open(os.path.join(tempdir, 'inspect_actual%spy' % os.extsep),
+ 'w', encoding='utf-8') as f:
+ f.write(textwrap.dedent("""
+ import inspect_other
+ class A:
+ def f(self):
+ pass
+ class A:
+ def f(self):
+ pass # correct one
+ A.f = inspect_other.A.f
+ """))
+
+ with open(os.path.join(tempdir, 'inspect_other%spy' % os.extsep),
+ 'w', encoding='utf-8') as f:
+ f.write(textwrap.dedent("""
+ class A:
+ def f(self):
+ pass
+ """))
+
+ with DirsOnSysPath(tempdir):
+ import inspect_actual
+ self.assertIn("correct", inspect.getsource(inspect_actual.A))
+
@unittest.skipIf(
support.is_emscripten or support.is_wasi,
"socket.accept is broken"