diff -r e18ac7370113 Doc/whatsnew/3.6.rst --- a/Doc/whatsnew/3.6.rst Sat Jun 18 13:56:16 2016 +0300 +++ b/Doc/whatsnew/3.6.rst Sat Jun 18 14:42:37 2016 +0300 @@ -555,6 +555,10 @@ Deprecated Python modules, functions and been deprecated in previous versions of Python in favour of :meth:`importlib.abc.Loader.exec_module`. +* Undocumented support of general :term:`bytes-like objects ` + as path in :func:`compile` and similar functions is now deprecated. + (Contributed by Serhiy Storchaka in :issue:`26754`.) + Deprecated functions and types of the C API ------------------------------------------- diff -r e18ac7370113 Lib/test/test_compile.py --- a/Lib/test/test_compile.py Sat Jun 18 13:56:16 2016 +0300 +++ b/Lib/test/test_compile.py Sat Jun 18 14:42:37 2016 +0300 @@ -473,10 +473,13 @@ if 1: self.assertEqual(d, {1: 2, 3: 4}) def test_compile_filename(self): - for filename in ('file.py', b'file.py', - bytearray(b'file.py'), memoryview(b'file.py')): + for filename in 'file.py', b'file.py': code = compile('pass', filename, 'exec') 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') @support.cpython_only diff -r e18ac7370113 Lib/test/test_parser.py --- a/Lib/test/test_parser.py Sat Jun 18 13:56:16 2016 +0300 +++ b/Lib/test/test_parser.py Sat Jun 18 14:42:37 2016 +0300 @@ -632,12 +632,18 @@ class CompileTestCase(unittest.TestCase) self.assertEqual(code.co_filename, '') code = st.compile() self.assertEqual(code.co_filename, '') - for filename in ('file.py', b'file.py', - bytearray(b'file.py'), memoryview(b'file.py')): + for filename in 'file.py', b'file.py': code = parser.compilest(st, filename) self.assertEqual(code.co_filename, 'file.py') code = st.compile(filename) 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, st.compile, list(b'file.py')) diff -r e18ac7370113 Lib/test/test_symtable.py --- a/Lib/test/test_symtable.py Sat Jun 18 13:56:16 2016 +0300 +++ b/Lib/test/test_symtable.py Sat Jun 18 14:42:37 2016 +0300 @@ -158,9 +158,11 @@ class SymtableTest(unittest.TestCase): checkfilename("def f(x): foo)(") # parse-time checkfilename("def f(x): global x") # symtable-build-time 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", memoryview(b"spam"), "exec") + with self.assertWarns(DeprecationWarning): + symtable.symtable("pass", memoryview(b"spam"), "exec") with self.assertRaises(TypeError): symtable.symtable("pass", list(b"spam"), "exec") diff -r e18ac7370113 Lib/test/test_zipimport.py --- a/Lib/test/test_zipimport.py Sat Jun 18 13:56:16 2016 +0300 +++ b/Lib/test/test_zipimport.py Sat Jun 18 14:42:37 2016 +0300 @@ -629,8 +629,10 @@ class UncompressedZipImportTestCase(Impo zipimport.zipimporter(filename) zipimport.zipimporter(os.fsencode(filename)) - zipimport.zipimporter(bytearray(os.fsencode(filename))) - zipimport.zipimporter(memoryview(os.fsencode(filename))) + with self.assertWarns(DeprecationWarning): + zipimport.zipimporter(bytearray(os.fsencode(filename))) + with self.assertWarns(DeprecationWarning): + zipimport.zipimporter(memoryview(os.fsencode(filename))) @support.requires_zlib diff -r e18ac7370113 Objects/unicodeobject.c --- a/Objects/unicodeobject.c Sat Jun 18 13:56:16 2016 +0300 +++ b/Objects/unicodeobject.c Sat Jun 18 14:42:37 2016 +0300 @@ -3837,7 +3837,13 @@ PyUnicode_FSDecoder(PyObject* arg, void* output = arg; 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); if (!arg) return 0; @@ -3846,11 +3852,6 @@ PyUnicode_FSDecoder(PyObject* arg, void* Py_DECREF(arg); if (!output) return 0; - if (!PyUnicode_Check(output)) { - Py_DECREF(output); - PyErr_SetString(PyExc_TypeError, "decoder failed to return unicode"); - return 0; - } } else { PyErr_Format(PyExc_TypeError,