diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 0f182d42402063..cb5a619f02a48c 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -63,6 +63,13 @@ def text_encoding(encoding, stacklevel=2): return encoding +# Wrapper for builtins.open +# +# Trick so that open() won't become a bound method when stored +# as a class variable (as dbm.dumb does). +# +# See init_set_builtins_open() in Python/pylifecycle.c. +@staticmethod def open(file, mode="r", buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None): @@ -313,18 +320,9 @@ def __get__(self, obj, typ=None): "errors=None, newline=None, closefd=True)\n\n" + open.__doc__) -class OpenWrapper: - """Wrapper for builtins.open - Trick so that open won't become a bound method when stored - as a class variable (as dbm.dumb does). - - See initstdio() in Python/pylifecycle.c. - """ - __doc__ = DocDescriptor() - - def __new__(cls, *args, **kwargs): - return open(*args, **kwargs) +# bpo-43680: Alias to open() kept for backward compatibility +OpenWrapper = open # In normal operation, both `UnsupportedOperation`s should be bound to the diff --git a/Misc/NEWS.d/next/Library/2021-04-12-09-57-37.bpo-43680.o1zEk_.rst b/Misc/NEWS.d/next/Library/2021-04-12-09-57-37.bpo-43680.o1zEk_.rst new file mode 100644 index 00000000000000..cb561ae586a98d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-04-12-09-57-37.bpo-43680.o1zEk_.rst @@ -0,0 +1,6 @@ +The Python :func:`_pyio.open` function becomes a static method to behave as +:func:`io.open` built-in function: don't become a bound method when stored as a +class variable. It becomes possible since static methods are now callable in +Python 3.10. Moreover, :func:`_pyio.OpenWrapper` becomes a simple alias to +:func:`_pyio.open`. +Patch by Victor Stinner. diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 0ad1796e3cbc6e..2dbebe45fd4b0b 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2241,7 +2241,7 @@ create_stdio(const PyConfig *config, PyObject* io, return NULL; } -/* Set builtins.open to io.OpenWrapper */ +/* Set builtins.open to io.open */ static PyStatus init_set_builtins_open(void) { @@ -2257,7 +2257,7 @@ init_set_builtins_open(void) goto error; } - if (!(wrapper = PyObject_GetAttrString(iomod, "OpenWrapper"))) { + if (!(wrapper = PyObject_GetAttrString(iomod, "open"))) { goto error; } @@ -2279,7 +2279,7 @@ init_set_builtins_open(void) } -/* Initialize sys.stdin, stdout, stderr and builtins.open */ +/* Create sys.stdin, sys.stdout and sys.stderr */ static PyStatus init_sys_streams(PyThreadState *tstate) { pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy