mirror of https://github.com/python/cpython
gh-71765: Fix inspect.getsource() on empty file (GH-20809)
* bpo-27578: Fix inspect.getsource() on empty file For modules from empty files, `inspect.getsource()` now returns an empty string, and `inspect.getsourcelines()` returns a list of one empty string, fixing the expected invariant. As indicated by `exec('')`, empty strings are valid Python source code. Co-authored-by: Oleg Iarygin <oleg@arhadthedev.net>
This commit is contained in:
parent
f6cdc6b4a1
commit
52ef4430a9
|
@ -137,7 +137,9 @@ def updatecache(filename, module_globals=None):
|
|||
lines = fp.readlines()
|
||||
except (OSError, UnicodeDecodeError, SyntaxError):
|
||||
return []
|
||||
if lines and not lines[-1].endswith('\n'):
|
||||
if not lines:
|
||||
lines = ['\n']
|
||||
elif not lines[-1].endswith('\n'):
|
||||
lines[-1] += '\n'
|
||||
size, mtime = stat.st_size, stat.st_mtime
|
||||
cache[filename] = size, mtime, lines, fullname
|
||||
|
|
|
@ -35,7 +35,7 @@ except ImportError:
|
|||
from test.support import cpython_only
|
||||
from test.support import MISSING_C_DOCSTRINGS, ALWAYS_EQ
|
||||
from test.support.import_helper import DirsOnSysPath, ready_to_import
|
||||
from test.support.os_helper import TESTFN
|
||||
from test.support.os_helper import TESTFN, temp_cwd
|
||||
from test.support.script_helper import assert_python_ok, assert_python_failure, kill_python
|
||||
from test.support import has_subprocess_support, SuppressCrashReport
|
||||
from test import support
|
||||
|
@ -730,6 +730,18 @@ class TestRetrievingSourceCode(GetSourceBase):
|
|||
finally:
|
||||
del linecache.cache[co.co_filename]
|
||||
|
||||
def test_getsource_empty_file(self):
|
||||
with temp_cwd() as cwd:
|
||||
with open('empty_file.py', 'w'):
|
||||
pass
|
||||
sys.path.insert(0, cwd)
|
||||
try:
|
||||
import empty_file
|
||||
self.assertEqual(inspect.getsource(empty_file), '\n')
|
||||
self.assertEqual(inspect.getsourcelines(empty_file), (['\n'], 0))
|
||||
finally:
|
||||
sys.path.remove(cwd)
|
||||
|
||||
def test_getfile(self):
|
||||
self.assertEqual(inspect.getfile(mod.StupidGit), mod.__file__)
|
||||
|
||||
|
|
|
@ -83,6 +83,10 @@ class GetLineTestsBadData(TempFile):
|
|||
class EmptyFile(GetLineTestsGoodData, unittest.TestCase):
|
||||
file_list = []
|
||||
|
||||
def test_getlines(self):
|
||||
lines = linecache.getlines(self.file_name)
|
||||
self.assertEqual(lines, ['\n'])
|
||||
|
||||
|
||||
class SingleEmptyLine(GetLineTestsGoodData, unittest.TestCase):
|
||||
file_list = ['\n']
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
:func:`inspect.getsource` (and related functions) work with
|
||||
empty module files, returning ``'\n'`` (or reasonable equivalent)
|
||||
instead of raising ``OSError``. Patch by Kernc.
|
Loading…
Reference in New Issue