Mailing List Archive

bpo-44648: Fix error type in inspect.getsource() in interactive session (GH-27171)
https://github.com/python/cpython/commit/48a62559dfaf775e4f1cc56b19379c799e8e2587
commit: 48a62559dfaf775e4f1cc56b19379c799e8e2587
branch: main
author: andrei kulakov <andrei.avk@gmail.com>
committer: ambv <lukasz@langa.pl>
date: 2021-07-30T19:17:46+02:00
summary:

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

files:
A Misc/NEWS.d/next/Library/2021-07-15-16-51-32.bpo-44648.2o49TB.rst
M Lib/inspect.py
M Lib/test/test_inspect.py

diff --git a/Lib/inspect.py b/Lib/inspect.py
index 7e9f7ce11e875..a5f0352fc722e 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -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__
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index cbd574d54400c..a46dc9ba594dc 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -585,6 +585,20 @@ def monkey(filename, module_globals=None):
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__":
diff --git a/Misc/NEWS.d/next/Library/2021-07-15-16-51-32.bpo-44648.2o49TB.rst b/Misc/NEWS.d/next/Library/2021-07-15-16-51-32.bpo-44648.2o49TB.rst
new file mode 100644
index 0000000000000..f7171c3c84c5e
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-07-15-16-51-32.bpo-44648.2o49TB.rst
@@ -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.

_______________________________________________
Python-checkins mailing list
Python-checkins@python.org
https://mail.python.org/mailman/listinfo/python-checkins