bpo-44648: Fix error type in inspect.getsource() in interactive session (GH-27171)

This commit is contained in:
andrei kulakov 2021-07-30 13:17:46 -04:00 committed by GitHub
parent ceea579ccc
commit 48a62559df
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 1 deletions

View file

@ -781,6 +781,8 @@ def getfile(object):
module = sys.modules.get(object.__module__)
if getattr(module, '__file__', None):
return module.__file__
if object.__module__ == '__main__':
raise OSError('source code not available')
raise TypeError('{!r} is a built-in class'.format(object))
if ismethod(object):
object = object.__func__

View file

@ -585,6 +585,20 @@ class TestRetrievingSourceCode(GetSourceBase):
def test_getsource_on_code_object(self):
self.assertSourceEqual(mod.eggs.__code__, 12, 18)
class TestGetsourceInteractive(unittest.TestCase):
def tearDown(self):
mod.ParrotDroppings.__module__ = mod
sys.modules['__main__'] = self.main
def test_getclasses_interactive(self):
self.main = sys.modules['__main__']
class MockModule:
__file__ = None
sys.modules['__main__'] = MockModule
mod.ParrotDroppings.__module__ = '__main__'
with self.assertRaisesRegex(OSError, 'source code not available') as e:
inspect.getsource(mod.ParrotDroppings)
class TestGettingSourceOfToplevelFrames(GetSourceBase):
fodderModule = mod
@ -4342,7 +4356,8 @@ def test_main():
TestBoundArguments, TestSignaturePrivateHelpers,
TestSignatureDefinitions, TestIsDataDescriptor,
TestGetClosureVars, TestUnwrap, TestMain, TestReload,
TestGetCoroutineState, TestGettingSourceOfToplevelFrames
TestGetCoroutineState, TestGettingSourceOfToplevelFrames,
TestGetsourceInteractive,
)
if __name__ == "__main__":

View file

@ -0,0 +1,3 @@
Fixed wrong error being thrown by :func:`inspect.getsource` when examining a
class in the interactive session. Instead of :exc:`TypeError`, it should be
:exc:`OSError` with appropriate error message.