gh-106727: Add `__module__` check for `inspect.getsource(cls)` (#106968)

This commit is contained in:
Tian Gao 2023-07-24 12:12:45 -08:00 committed by GitHub
parent 8ebc9fc321
commit b383703491
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 1 deletions

View File

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

View File

@ -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"