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

(cherry picked from commit 48a62559df)

Co-authored-by: andrei kulakov <andrei.avk@gmail.com>
This commit is contained in:
Miss Islington (bot) 2021-07-30 10:46:42 -07:00 committed by GitHub
parent 440c9f772a
commit f468ede4a2
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
@ -4349,7 +4363,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.