mirror of
https://github.com/python/cpython.git
synced 2025-11-11 19:12:05 +00:00
bpo-43680: Deprecate io.OpenWrapper (GH-25357)
Deprecate io.OpenWrapper and _pyio.OpenWrapper: use io.open and _pyio.open instead. Until Python 3.9, _pyio.open was not a static method and builtins.open was set to OpenWrapper to not become a bound method when set to a class variable. _io.open is a built-in function whereas _pyio.open is a Python function. In Python 3.10, _pyio.open() is now a static method, and builtins.open() is now io.open().
This commit is contained in:
parent
11159d2c9d
commit
3bc694d5f3
4 changed files with 44 additions and 15 deletions
26
Lib/_pyio.py
26
Lib/_pyio.py
|
|
@ -311,18 +311,20 @@ def _open_code_with_warning(path):
|
||||||
open_code = _open_code_with_warning
|
open_code = _open_code_with_warning
|
||||||
|
|
||||||
|
|
||||||
class DocDescriptor:
|
def __getattr__(name):
|
||||||
"""Helper for builtins.open.__doc__
|
if name == "OpenWrapper":
|
||||||
"""
|
# bpo-43680: Until Python 3.9, _pyio.open was not a static method and
|
||||||
def __get__(self, obj, typ=None):
|
# builtins.open was set to OpenWrapper to not become a bound method
|
||||||
return (
|
# when set to a class variable. _io.open is a built-in function whereas
|
||||||
"open(file, mode='r', buffering=-1, encoding=None, "
|
# _pyio.open is a Python function. In Python 3.10, _pyio.open() is now
|
||||||
"errors=None, newline=None, closefd=True)\n\n" +
|
# a static method, and builtins.open() is now io.open().
|
||||||
open.__doc__)
|
import warnings
|
||||||
|
warnings.warn('OpenWrapper is deprecated, use open instead',
|
||||||
|
DeprecationWarning, stacklevel=2)
|
||||||
# bpo-43680: Alias to open() kept for backward compatibility
|
global OpenWrapper
|
||||||
OpenWrapper = open
|
OpenWrapper = open
|
||||||
|
return OpenWrapper
|
||||||
|
raise AttributeError(name)
|
||||||
|
|
||||||
|
|
||||||
# In normal operation, both `UnsupportedOperation`s should be bound to the
|
# In normal operation, both `UnsupportedOperation`s should be bound to the
|
||||||
|
|
|
||||||
17
Lib/io.py
17
Lib/io.py
|
|
@ -56,7 +56,22 @@
|
||||||
BufferedWriter, BufferedRWPair, BufferedRandom,
|
BufferedWriter, BufferedRWPair, BufferedRandom,
|
||||||
IncrementalNewlineDecoder, text_encoding, TextIOWrapper)
|
IncrementalNewlineDecoder, text_encoding, TextIOWrapper)
|
||||||
|
|
||||||
OpenWrapper = _io.open # for compatibility with _pyio
|
|
||||||
|
def __getattr__(name):
|
||||||
|
if name == "OpenWrapper":
|
||||||
|
# bpo-43680: Until Python 3.9, _pyio.open was not a static method and
|
||||||
|
# builtins.open was set to OpenWrapper to not become a bound method
|
||||||
|
# when set to a class variable. _io.open is a built-in function whereas
|
||||||
|
# _pyio.open is a Python function. In Python 3.10, _pyio.open() is now
|
||||||
|
# a static method, and builtins.open() is now io.open().
|
||||||
|
import warnings
|
||||||
|
warnings.warn('OpenWrapper is deprecated, use open instead',
|
||||||
|
DeprecationWarning, stacklevel=2)
|
||||||
|
global OpenWrapper
|
||||||
|
OpenWrapper = open
|
||||||
|
return OpenWrapper
|
||||||
|
raise AttributeError(name)
|
||||||
|
|
||||||
|
|
||||||
# Pretend this exception was created here.
|
# Pretend this exception was created here.
|
||||||
UnsupportedOperation.__module__ = "io"
|
UnsupportedOperation.__module__ = "io"
|
||||||
|
|
|
||||||
|
|
@ -4283,6 +4283,14 @@ def test_check_encoding_warning(self):
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
warnings[1].startswith(b"<string>:8: EncodingWarning: "))
|
warnings[1].startswith(b"<string>:8: EncodingWarning: "))
|
||||||
|
|
||||||
|
@support.cpython_only
|
||||||
|
# Depending if OpenWrapper was already created or not, the warning is
|
||||||
|
# emitted or not. For example, the attribute is already created when this
|
||||||
|
# test is run multiple times.
|
||||||
|
@warnings_helper.ignore_warnings(category=DeprecationWarning)
|
||||||
|
def test_openwrapper(self):
|
||||||
|
self.assertIs(self.io.OpenWrapper, self.io.open)
|
||||||
|
|
||||||
|
|
||||||
class CMiscIOTest(MiscIOTest):
|
class CMiscIOTest(MiscIOTest):
|
||||||
io = io
|
io = io
|
||||||
|
|
@ -4598,8 +4606,6 @@ def load_tests(*args):
|
||||||
globs = globals()
|
globs = globals()
|
||||||
c_io_ns.update((x.__name__, globs["C" + x.__name__]) for x in mocks)
|
c_io_ns.update((x.__name__, globs["C" + x.__name__]) for x in mocks)
|
||||||
py_io_ns.update((x.__name__, globs["Py" + x.__name__]) for x in mocks)
|
py_io_ns.update((x.__name__, globs["Py" + x.__name__]) for x in mocks)
|
||||||
# Avoid turning open into a bound method.
|
|
||||||
py_io_ns["open"] = pyio.OpenWrapper
|
|
||||||
for test in tests:
|
for test in tests:
|
||||||
if test.__name__.startswith("C"):
|
if test.__name__.startswith("C"):
|
||||||
for name, obj in c_io_ns.items():
|
for name, obj in c_io_ns.items():
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
Deprecate io.OpenWrapper and _pyio.OpenWrapper: use io.open and _pyio.open
|
||||||
|
instead. Until Python 3.9, _pyio.open was not a static method and
|
||||||
|
builtins.open was set to OpenWrapper to not become a bound method when set
|
||||||
|
to a class variable. _io.open is a built-in function whereas _pyio.open is a
|
||||||
|
Python function. In Python 3.10, _pyio.open() is now a static method, and
|
||||||
|
builtins.open() is now io.open().
|
||||||
Loading…
Add table
Add a link
Reference in a new issue