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):
"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
--- /dev/null
+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.
return NULL;
}
-/* Set builtins.open to io.OpenWrapper */
+/* Set builtins.open to io.open */
static PyStatus
init_set_builtins_open(void)
{
goto error;
}
- if (!(wrapper = PyObject_GetAttrString(iomod, "OpenWrapper"))) {
+ if (!(wrapper = PyObject_GetAttrString(iomod, "open"))) {
goto error;
}
}
-/* Initialize sys.stdin, stdout, stderr and builtins.open */
+/* Create sys.stdin, sys.stdout and sys.stderr */
static PyStatus
init_sys_streams(PyThreadState *tstate)
{