mirror of
https://github.com/python/cpython.git
synced 2025-09-11 19:27:07 +00:00
Issue #26754: Undocumented support of general bytes-like objects
as path in compile() and similar functions is now deprecated.
This commit is contained in:
parent
d73c31899e
commit
febc332056
7 changed files with 34 additions and 16 deletions
|
@ -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
|
||||||
|
|
|
@ -473,8 +473,11 @@ 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')
|
||||||
|
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')
|
code = compile('pass', filename, 'exec')
|
||||||
self.assertEqual(code.co_filename, 'file.py')
|
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')
|
||||||
|
|
|
@ -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'))
|
||||||
|
|
||||||
|
|
|
@ -158,8 +158,10 @@ 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")
|
||||||
|
with self.assertWarns(DeprecationWarning):
|
||||||
symtable.symtable("pass", memoryview(b"spam"), "exec")
|
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")
|
||||||
|
|
|
@ -629,7 +629,9 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
|
||||||
|
|
||||||
zipimport.zipimporter(filename)
|
zipimport.zipimporter(filename)
|
||||||
zipimport.zipimporter(os.fsencode(filename))
|
zipimport.zipimporter(os.fsencode(filename))
|
||||||
|
with self.assertWarns(DeprecationWarning):
|
||||||
zipimport.zipimporter(bytearray(os.fsencode(filename)))
|
zipimport.zipimporter(bytearray(os.fsencode(filename)))
|
||||||
|
with self.assertWarns(DeprecationWarning):
|
||||||
zipimport.zipimporter(memoryview(os.fsencode(filename)))
|
zipimport.zipimporter(memoryview(os.fsencode(filename)))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue