Issue #26754: Undocumented support of general bytes-like objects

as path in compile() and similar functions is now deprecated.
This commit is contained in:
Serhiy Storchaka 2016-08-06 23:29:29 +03:00
parent d73c31899e
commit febc332056
7 changed files with 34 additions and 16 deletions

View file

@ -639,8 +639,9 @@ Deprecated features
(Contributed by Serhiy Storchaka in :issue:`21708`.) (Contributed by Serhiy Storchaka in :issue:`21708`.)
* Undocumented support of general :term:`bytes-like objects <bytes-like object>` * Undocumented support of general :term:`bytes-like objects <bytes-like object>`
as paths in :mod:`os` functions is now deprecated. as paths in :mod:`os` functions, :func:`compile` and similar functions is
(Contributed by Serhiy Storchaka in :issue:`25791`.) now deprecated.
(Contributed by Serhiy Storchaka in :issue:`25791` and :issue:`26754`.)
Deprecated Python behavior Deprecated Python behavior

View file

@ -473,10 +473,13 @@ if 1:
self.assertEqual(d, {1: 2, 3: 4}) self.assertEqual(d, {1: 2, 3: 4})
def test_compile_filename(self): def test_compile_filename(self):
for filename in ('file.py', b'file.py', for filename in 'file.py', b'file.py':
bytearray(b'file.py'), memoryview(b'file.py')):
code = compile('pass', filename, 'exec') code = compile('pass', filename, 'exec')
self.assertEqual(code.co_filename, 'file.py') self.assertEqual(code.co_filename, 'file.py')
for filename in bytearray(b'file.py'), memoryview(b'file.py'):
with self.assertWarns(DeprecationWarning):
code = compile('pass', filename, 'exec')
self.assertEqual(code.co_filename, 'file.py')
self.assertRaises(TypeError, compile, 'pass', list(b'file.py'), 'exec') self.assertRaises(TypeError, compile, 'pass', list(b'file.py'), 'exec')
@support.cpython_only @support.cpython_only

View file

@ -632,12 +632,18 @@ class CompileTestCase(unittest.TestCase):
self.assertEqual(code.co_filename, '<syntax-tree>') self.assertEqual(code.co_filename, '<syntax-tree>')
code = st.compile() code = st.compile()
self.assertEqual(code.co_filename, '<syntax-tree>') self.assertEqual(code.co_filename, '<syntax-tree>')
for filename in ('file.py', b'file.py', for filename in 'file.py', b'file.py':
bytearray(b'file.py'), memoryview(b'file.py')):
code = parser.compilest(st, filename) code = parser.compilest(st, filename)
self.assertEqual(code.co_filename, 'file.py') self.assertEqual(code.co_filename, 'file.py')
code = st.compile(filename) code = st.compile(filename)
self.assertEqual(code.co_filename, 'file.py') self.assertEqual(code.co_filename, 'file.py')
for filename in bytearray(b'file.py'), memoryview(b'file.py'):
with self.assertWarns(DeprecationWarning):
code = parser.compilest(st, filename)
self.assertEqual(code.co_filename, 'file.py')
with self.assertWarns(DeprecationWarning):
code = st.compile(filename)
self.assertEqual(code.co_filename, 'file.py')
self.assertRaises(TypeError, parser.compilest, st, list(b'file.py')) self.assertRaises(TypeError, parser.compilest, st, list(b'file.py'))
self.assertRaises(TypeError, st.compile, list(b'file.py')) self.assertRaises(TypeError, st.compile, list(b'file.py'))

View file

@ -158,9 +158,11 @@ class SymtableTest(unittest.TestCase):
checkfilename("def f(x): foo)(") # parse-time checkfilename("def f(x): foo)(") # parse-time
checkfilename("def f(x): global x") # symtable-build-time checkfilename("def f(x): global x") # symtable-build-time
symtable.symtable("pass", b"spam", "exec") symtable.symtable("pass", b"spam", "exec")
with self.assertRaises(TypeError): with self.assertWarns(DeprecationWarning), \
self.assertRaises(TypeError):
symtable.symtable("pass", bytearray(b"spam"), "exec") symtable.symtable("pass", bytearray(b"spam"), "exec")
symtable.symtable("pass", memoryview(b"spam"), "exec") with self.assertWarns(DeprecationWarning):
symtable.symtable("pass", memoryview(b"spam"), "exec")
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
symtable.symtable("pass", list(b"spam"), "exec") symtable.symtable("pass", list(b"spam"), "exec")

View file

@ -629,8 +629,10 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
zipimport.zipimporter(filename) zipimport.zipimporter(filename)
zipimport.zipimporter(os.fsencode(filename)) zipimport.zipimporter(os.fsencode(filename))
zipimport.zipimporter(bytearray(os.fsencode(filename))) with self.assertWarns(DeprecationWarning):
zipimport.zipimporter(memoryview(os.fsencode(filename))) zipimport.zipimporter(bytearray(os.fsencode(filename)))
with self.assertWarns(DeprecationWarning):
zipimport.zipimporter(memoryview(os.fsencode(filename)))
@support.requires_zlib @support.requires_zlib

View file

@ -43,6 +43,9 @@ Core and Builtins
Library Library
------- -------
- Issue #26754: Undocumented support of general bytes-like objects
as path in compile() and similar functions is now deprecated.
- Issue #26800: Undocumented support of general bytes-like objects - Issue #26800: Undocumented support of general bytes-like objects
as paths in os functions is now deprecated. as paths in os functions is now deprecated.

View file

@ -3837,7 +3837,13 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr)
output = arg; output = arg;
Py_INCREF(output); Py_INCREF(output);
} }
else if (PyObject_CheckBuffer(arg)) { else if (PyBytes_Check(arg) || PyObject_CheckBuffer(arg)) {
if (!PyBytes_Check(arg) &&
PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
"path should be string or bytes, not %.200s",
Py_TYPE(arg)->tp_name)) {
return 0;
}
arg = PyBytes_FromObject(arg); arg = PyBytes_FromObject(arg);
if (!arg) if (!arg)
return 0; return 0;
@ -3846,11 +3852,6 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr)
Py_DECREF(arg); Py_DECREF(arg);
if (!output) if (!output)
return 0; return 0;
if (!PyUnicode_Check(output)) {
Py_DECREF(output);
PyErr_SetString(PyExc_TypeError, "decoder failed to return unicode");
return 0;
}
} }
else { else {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,