| Release: | |release| |
|---|---|
| Date: | |today| |
This article explains the new features in Python 3.12, compared to 3.11.
For full details, see the :ref:`changelog <changelog>`.
Note
Prerelease users should be aware that this document is currently in draft form. It will be updated substantially as Python 3.12 moves towards release, so it's worth checking back even after reading earlier versions.
Important deprecations, removals or restrictions:
- PEP 623, Remove wstr from Unicode
- :class:`types.MappingProxyType` instances are now hashable if the underlying mapping is hashable. (Contributed by Serhiy Storchaka in :gh:`87995`.)
- :class:`memoryview` now supports the half-float type (the "e" format code). (Contributed by Dong-hee Na and Antoine Pitrou in :gh:`90751`.)
- The parser now raises :exc:`SyntaxError` when parsing source code containing null bytes. (Contributed by Pablo Galindo in :gh:`96670`.)
- :func:`ast.parse` now raises :exc:`SyntaxError` instead of :exc:`ValueError` when parsing source code containing null bytes. (Contributed by Pablo Galindo in :gh:`96670`.)
- None yet.
- Add :meth:`~pathlib.Path.walk` for walking the directory trees and generating all file or directory names within them, similar to :func:`os.walk`. (Contributed by Stanislav Zmiev in :gh:`90385`.)
- Pseudo instruction opcodes (which are used by the compiler but do not appear in executable bytecode) are now exposed in the :mod:`dis` module. :data:`~dis.HAVE_ARGUMENT` is still relevant to real opcodes, but it is not useful for pseudo instructions. Use the new :data:`~dis.hasarg` collection instead. (Contributed by Irit Katriel in :gh:`94216`.)
- Add :data:`os.PIDFD_NONBLOCK` to open a file descriptor for a process with :func:`os.pidfd_open` in non-blocking mode. (Contributed by Kumar Aditya in :gh:`93312`.)
- Add a :ref:`command-line interface <sqlite3-cli>`. (Contributed by Erlend E. Aasland in :gh:`77617`.)
- Add :func:`threading.settrace_all_threads` and :func:`threading.setprofile_all_threads` that allow to set tracing and profiling functions in all running threads in addition to the calling one. (Contributed by Pablo Galindo in :gh:`93503`.)
- The Unicode database has been updated to version 15.0.0. (Contributed by Benjamin Peterson in :gh:`96734`).
- Removed
wstrandwstr_lengthmembers from Unicode objects. It reduces object size by 8 or 16 bytes on 64bit platform. (PEP 623) (Contributed by Inada Naoki in :gh:`92536`.) - Added experimental support for using the BOLT binary optimizer in the build process, which improves performance by 1-5%. (Contributed by Kevin Modzelewski in :gh:`90536`.)
- Removed the :opcode:`LOAD_METHOD` instruction. It has been merged into :opcode:`LOAD_ATTR`. :opcode:`LOAD_ATTR` will now behave like the old :opcode:`LOAD_METHOD` instruction if the low bit of its oparg is set. (Contributed by Ken Jin in :gh:`93429`.)
- :class:`typing.Hashable` and :class:`typing.Sized` aliases for :class:`collections.abc.Hashable` and :class:`collections.abc.Sized`. (:gh:`94309`.)
- The :mod:`sqlite3` :ref:`default adapters and converters <sqlite3-default-converters>` are now deprecated. Instead, use the :ref:`sqlite3-adapter-converter-recipes` and tailor them to your needs. (Contributed by Erlend E. Aasland in :gh:`90016`.)
The following modules and APIs have been deprecated in earlier Python releases, and will be removed in Python 3.13.
Modules (see PEP 594):
- :mod:`aifc`
- :mod:`audioop`
- :mod:`cgi`
- :mod:`cgitb`
- :mod:`chunk`
- :mod:`crypt`
- :mod:`imghdr`
- :mod:`mailcap`
- :mod:`msilib`
- :mod:`nis`
- :mod:`nntplib`
- :mod:`ossaudiodev`
- :mod:`pipes`
- :mod:`sndhdr`
- :mod:`spwd`
- :mod:`sunau`
- :mod:`telnetlib`
- :mod:`uu`
- :mod:`xdrlib`
APIs:
- :class:`configparser.LegacyInterpolation` (:gh:`90765`)
- :func:`locale.getdefaultlocale` (:gh:`90817`)
- :meth:`turtle.RawTurtle.settiltangle` (:gh:`50096`)
- :func:`unittest.findTestCases` (:gh:`50096`)
- :func:`unittest.makeSuite` (:gh:`50096`)
- :func:`unittest.getTestCaseNames` (:gh:`50096`)
- :class:`webbrowser.MacOSX` (:gh:`86421`)
Deprecated the following :mod:`importlib.abc` classes, scheduled for removal in Python 3.14:
- :class:`importlib.abc.ResourceReader`
- :class:`importlib.abc.Traversable`
- :class:`importlib.abc.TraversableResources`
Use :mod:`importlib.resources.abc` classes instead:
- :class:`importlib.resources.abc.TraversableResources`
- :class:`importlib.resources.abc.Traversable`
- :class:`importlib.resources.abc.TraversableResources`
(Contributed by Jason R. Coombs and Hugo van Kemenade in :gh:`93963`.)
Creating :c:data:`immutable types <Py_TPFLAGS_IMMUTABLETYPE>` with mutable bases using the C API.
The following APIs were deprecated in earlier Python versions and will be removed, although there is currently no date scheduled for their removal.
- :class:`typing.Text` (:gh:`92332`)
- Currently Python accepts numeric literals immediately followed by keywords,
for example
0in x,1or x,0if 1else 2. It allows confusing and ambiguous expressions like[0x1for x in y](which can be interpreted as[0x1 for x in y]or[0x1f or x in y]). A syntax warning is raised if the numeric literal is immediately followed by one of keywords :keyword:`and`, :keyword:`else`, :keyword:`for`, :keyword:`if`, :keyword:`in`, :keyword:`is` and :keyword:`or`. In a future release it will be changed to a syntax error. (:gh:`87999`)
Removed many old deprecated :mod:`unittest` features:
A number of :class:`~unittest.TestCase` method aliases:
Deprecated alias
Method Name
Deprecated in
failUnless:meth:`.assertTrue`
3.1
failIf:meth:`.assertFalse`
3.1
failUnlessEqual:meth:`.assertEqual`
3.1
failIfEqual:meth:`.assertNotEqual`
3.1
failUnlessAlmostEqual:meth:`.assertAlmostEqual`
3.1
failIfAlmostEqual:meth:`.assertNotAlmostEqual`
3.1
failUnlessRaises:meth:`.assertRaises`
3.1
assert_:meth:`.assertTrue`
3.2
assertEquals:meth:`.assertEqual`
3.2
assertNotEquals:meth:`.assertNotEqual`
3.2
assertAlmostEquals:meth:`.assertAlmostEqual`
3.2
assertNotAlmostEquals:meth:`.assertNotAlmostEqual`
3.2
assertRegexpMatches:meth:`.assertRegex`
3.2
assertRaisesRegexp:meth:`.assertRaisesRegex`
3.2
assertNotRegexpMatches:meth:`.assertNotRegex`
3.5
You can use https://github.com/isidentical/teyit to automatically modernise your unit tests.
Undocumented and broken :class:`~unittest.TestCase` method
assertDictContainsSubset(deprecated in Python 3.2).Undocumented :meth:`TestLoader.loadTestsFromModule <unittest.TestLoader.loadTestsFromModule>` parameter use_load_tests (deprecated and ignored since Python 3.2).
An alias of the :class:`~unittest.TextTestResult` class:
_TextTestResult(deprecated in Python 3.2).
(Contributed by Serhiy Storchaka in :issue:`45162`.)
Several names deprecated in the :mod:`configparser` way back in 3.2 have been removed per :gh:`89336`:
- :class:`configparser.ParsingError` no longer has a
filenameattribute or argument. Use thesourceattribute and argument instead. - :mod:`configparser` no longer has a
SafeConfigParserclass. Use the shorter :class:`~configparser.ConfigParser` name instead. - :class:`configparser.ConfigParser` no longer has a
readfpmethod. Use :meth:`~configparser.ConfigParser.read_file` instead.
- :class:`configparser.ParsingError` no longer has a
The following undocumented :mod:`sqlite3` features, deprecated in Python 3.10, are now removed:
sqlite3.enable_shared_cache()sqlite3.OptimizedUnicode
If a shared cache must be used, open the database in URI mode using the
cache=sharedquery parameter.The
sqlite3.OptimizedUnicodetext factory has been an alias for :class:`str` since Python 3.3. Code that previously set the text factory toOptimizedUnicodecan either usestrexplicitly, or rely on the default value which is alsostr.(Contributed by Erlend E. Aasland in :gh:`92548`.)
The
--experimental-isolated-subinterpretersconfigure flag (and correspondingEXPERIMENTAL_ISOLATED_SUBINTERPRETERS) have been removed.smtpdhas been removed according to the schedule in PEP 594, having been deprecated in Python 3.4.7 and 3.5.4. Use aiosmtpd PyPI module or any other :mod:`asyncio`-based server instead. (Contributed by Oleg Iarygin in :gh:`93243`.)
- Remove
io.OpenWrapperand_pyio.OpenWrapper, deprecated in Python 3.10: just use :func:`open` instead. The :func:`open` (:func:`io.open`) function is a built-in function. Since Python 3.10, :func:`_pyio.open` is also a static method. (Contributed by Victor Stinner in :gh:`94169`.) - Remove the :func:`ssl.RAND_pseudo_bytes` function, deprecated in Python 3.6: use :func:`os.urandom` or :func:`ssl.RAND_bytes` instead. (Contributed by Victor Stinner in :gh:`94199`.)
- :mod:`gzip`: Remove the
filenameattribute of :class:`gzip.GzipFile`, deprecated since Python 2.6, use the :attr:`~gzip.GzipFile.name` attribute instead. In write mode, thefilenameattribute added'.gz'file extension if it was not present. (Contributed by Victor Stinner in :gh:`94196`.) - Remove the :func:`ssl.match_hostname` function. The :func:`ssl.match_hostname` was deprecated in Python 3.7. OpenSSL performs hostname matching since Python 3.7, Python no longer uses the :func:`ssl.match_hostname` function. (Contributed by Victor Stinner in :gh:`94199`.)
- Remove the :func:`locale.format` function, deprecated in Python 3.7: use :func:`locale.format_string` instead. (Contributed by Victor Stinner in :gh:`94226`.)
- :mod:`hashlib`: Remove the pure Python implementation of :func:`hashlib.pbkdf2_hmac()`, deprecated in Python 3.10. Python 3.10 and newer requires OpenSSL 1.1.1 (PEP 644): this OpenSSL version provides a C implementation of :func:`~hashlib.pbkdf2_hmac()` which is faster. (Contributed by Victor Stinner in :gh:`94199`.)
- :mod:`xml.etree`: Remove the
ElementTree.Element.copy()method of the pure Python implementation, deprecated in Python 3.10, use the :func:`copy.copy` function instead. The C implementation of :mod:`xml.etree` has nocopy()method, only a__copy__()method. (Contributed by Victor Stinner in :gh:`94383`.) - :mod:`zipimport`: Remove
find_loader()andfind_module()methods, deprecated in Python 3.10: use thefind_spec()method instead. See PEP 451 for the rationale. (Contributed by Victor Stinner in :gh:`94379`.) - Remove the :func:`ssl.wrap_socket` function, deprecated in Python 3.7: instead, create a :class:`ssl.SSLContext` object and call its :class:`ssl.SSLContext.wrap_socket` method. Any package that still uses :func:`ssl.wrap_socket` is broken and insecure. The function neither sends a SNI TLS extension nor validates server hostname. Code is subject to CWE-295: Improper Certificate Validation. (Contributed by Victor Stinner in :gh:`94199`.)
This section lists previously described changes and other bugfixes that may require changes to your code.
- More strict rules are now applied for numerical group references and group names in regular expressions. Only sequence of ASCII digits is now accepted as a numerical reference. The group name in bytes patterns and replacement strings can now only contain ASCII letters and digits and underscore. (Contributed by Serhiy Storchaka in :gh:`91760`.)
- Removed randrange() functionality deprecated since Python 3.10. Formerly,
randrange(10.0) losslessly converted to randrange(10). Now, it raises a
TypeError. Also, the exception raised for non-integral values such as
randrange(10.5) or randrange('10') has been changed from ValueError to
TypeError. This also prevents bugs where
randrange(1e25)would silently select from a larger range thanrandrange(10**25). (Originally suggested by Serhiy Storchaka gh-86388.) - :class:`argparse.ArgumentParser` changed encoding and error handler
for reading arguments from file (e.g.
fromfile_prefix_charsoption) from default text encoding (e.g. :func:`locale.getpreferredencoding(False) <locale.getpreferredencoding>`) to :term:`filesystem encoding and error handler`. Argument files should be encoded in UTF-8 instead of ANSI Codepage on Windows. - Removed the
asyncore-basedsmtpdmodule deprecated in Python 3.4.7 and 3.5.4. A recommended replacement is the :mod:`asyncio`-based aiosmtpd PyPI module. - :func:`shlex.split`: Passing
Nonefor s argument now raises an exception, rather than reading :data:`sys.stdin`. The feature was deprecated in Python 3.9. (Contributed by Victor Stinner in :gh:`94352`.)
- Python no longer uses
setup.pyto build shared C extension modules. Build parameters like headers and libraries are detected inconfigurescript. Extensions are built byMakefile. Most extensions usepkg-configand fall back to manual detection. (Contributed by Christian Heimes in :gh:`93939`.) va_start()with two parameters, likeva_start(args, format),is now required to build Python.va_start()is no longer called with a single parameter. (Contributed by Kumar Aditya in :gh:`93207`.)- CPython now uses the ThinLTO option as the default link time optimization policy if the Clang compiler accepts the flag. (Contributed by Dong-hee Na in :gh:`89536`.)
Added the new limited C API function :c:func:`PyType_FromMetaclass`, which generalizes the existing :c:func:`PyType_FromModuleAndSpec` using an additional metaclass argument. (Contributed by Wenzel Jakob in :gh:`93012`.)
API for creating objects that can be called using :ref:`the vectorcall protocol <vectorcall>` was added to the :ref:`Limited API <stable>`:
- :const:`Py_TPFLAGS_HAVE_VECTORCALL`
- :c:func:`PyVectorcall_NARGS`
- :c:func:`PyVectorcall_Call`
- :c:type:`vectorcallfunc`
The :const:`Py_TPFLAGS_HAVE_VECTORCALL` flag is now removed from a class when the class's :py:meth:`~object.__call__` method is reassigned. This makes vectorcall safe to use with mutable types (i.e. heap types without the :const:`immutable <Py_TPFLAGS_IMMUTABLETYPE>` flag). Mutable types that do not override :c:member:`~PyTypeObject.tp_call` now inherit the
Py_TPFLAGS_HAVE_VECTORCALLflag. (Contributed by Petr Viktorin in :gh:`93274`.)The :const:`Py_TPFLAGS_MANAGED_DICT` and :const:`Py_TPFLAGS_MANAGED_WEAKREF` flags have been added. This allows extensions classes to support object
__dict__and weakrefs with less bookkeeping, using less memory and with faster access.Added two new public functions, :c:func:`PyEval_SetProfileAllThreads` and :c:func:`PyEval_SetTraceAllThreads`, that allow to set tracing and profiling functions in all running threads in addition to the calling one. (Contributed by Pablo Galindo in :gh:`93503`.)
Added new function :c:func:`PyFunction_SetVectorcall` to the C API which sets the vectorcall field of a given :c:type:`PyFunctionObject`. (Contributed by Andrew Frost in :gh:`92257`.)
Legacy Unicode APIs based on
Py_UNICODE*representation has been removed. Please migrate to APIs based on UTF-8 orwchar_t*.Argument parsing functions like :c:func:`PyArg_ParseTuple` doesn't support
Py_UNICODE*based format (e.g.u,Z) anymore. Please migrate to other formats for Unicode likes,z,es, andU.tp_weaklistfor all static builtin types is alwaysNULL. This is an internal-only field onPyTypeObjectbut we're pointing out the change in case someone happens to be accessing the field directly anyway. To avoid breakage, consider using the existing public C-API instead, or, if necessary, the (internal-only)_PyObject_GET_WEAKREFS_LISTPTR()macro.This internal-only :c:member:`PyTypeObject.tp_subclasses` may now not be a valid object pointer. Its type was changed to :c:expr:`void *` to reflect this. We mention this in case someone happens to be accessing the internal-only field directly.
To get a list of subclasses, call the Python method :py:meth:`~class.__subclasses__` (using :c:func:`PyObject_CallMethod`, for example).
An unrecognized format character in :c:func:`PyUnicode_FromFormat` and :c:func:`PyUnicode_FromFormatV` now sets a :exc:`SystemError`. In previous versions it caused all the rest of the format string to be copied as-is to the result string, and any extra arguments discarded. (Contributed by Serhiy Storchaka in :gh:`95781`.)
Fixed wrong sign placement in :c:func:`PyUnicode_FromFormat` and :c:func:`PyUnicode_FromFormatV`. (Contributed by Philip Georgi in :gh:`95504`.)
Extension classes wanting to add a
__dict__or weak reference slot should use :const:`Py_TPFLAGS_MANAGED_DICT` and :const:`Py_TPFLAGS_MANAGED_WEAKREF` instead oftp_dictoffsetandtp_weaklistoffset, respectively. The use oftp_dictoffsetandtp_weaklistoffsetis still supported, but does not fully support multiple inheritance (:gh: 95589), and performance may be worse. Classes declaring :const:`Py_TPFLAGS_MANAGED_DICT` should call :c:func:`_PyObject_VisitManagedDict` and :c:func:`_PyObject_ClearManagedDict` to traverse and clear their instance's dictionaries. To clear weakrefs, call :c:func:`PyObject_ClearWeakRefs`, as before.
Deprecate global configuration variable:
- :c:var:`Py_DebugFlag`: use :c:member:`PyConfig.parser_debug`
- :c:var:`Py_VerboseFlag`: use :c:member:`PyConfig.verbose`
- :c:var:`Py_QuietFlag`: use :c:member:`PyConfig.quiet`
- :c:var:`Py_InteractiveFlag`: use :c:member:`PyConfig.interactive`
- :c:var:`Py_InspectFlag`: use :c:member:`PyConfig.inspect`
- :c:var:`Py_OptimizeFlag`: use :c:member:`PyConfig.optimization_level`
- :c:var:`Py_NoSiteFlag`: use :c:member:`PyConfig.site_import`
- :c:var:`Py_BytesWarningFlag`: use :c:member:`PyConfig.bytes_warning`
- :c:var:`Py_FrozenFlag`: use :c:member:`PyConfig.pathconfig_warnings`
- :c:var:`Py_IgnoreEnvironmentFlag`: use :c:member:`PyConfig.use_environment`
- :c:var:`Py_DontWriteBytecodeFlag`: use :c:member:`PyConfig.write_bytecode`
- :c:var:`Py_NoUserSiteDirectory`: use :c:member:`PyConfig.user_site_directory`
- :c:var:`Py_UnbufferedStdioFlag`: use :c:member:`PyConfig.buffered_stdio`
- :c:var:`Py_HashRandomizationFlag`: use :c:member:`PyConfig.use_hash_seed` and :c:member:`PyConfig.hash_seed`
- :c:var:`Py_IsolatedFlag`: use :c:member:`PyConfig.isolated`
- :c:var:`Py_LegacyWindowsFSEncodingFlag`: use :c:member:`PyConfig.legacy_windows_fs_encoding`
- :c:var:`Py_LegacyWindowsStdioFlag`: use :c:member:`PyConfig.legacy_windows_stdio`
- :c:var:`Py_FileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding`
- :c:var:`Py_FileSystemDefaultEncodeErrors`: use :c:member:`PyConfig.filesystem_errors`
- :c:var:`Py_UTF8Mode`: use :c:member:`PyPreConfig.utf8_mode` (see :c:func:`Py_PreInitialize`)
The :c:func:`Py_InitializeFromConfig` API should be used with :c:type:`PyConfig` instead. (Contributed by Victor Stinner in :gh:`77782`.)
Creating :c:data:`immutable types <Py_TPFLAGS_IMMUTABLETYPE>` with mutable bases is deprecated and will be disabled in Python 3.14.
Remove the
token.hheader file. There was never any public tokenizer C API. Thetoken.hheader file was only designed to be used by Python internals. (Contributed by Victor Stinner in :gh:`92651`.)Leagcy Unicode APIs has been removed. See PEP 623 for detail.
- :c:macro:`PyUnicode_WCHAR_KIND`
- :c:func:`PyUnicode_AS_UNICODE`
- :c:func:`PyUnicode_AsUnicode`
- :c:func:`PyUnicode_AsUnicodeAndSize`
- :c:func:`PyUnicode_AS_DATA`
- :c:func:`PyUnicode_FromUnicode`
- :c:func:`PyUnicode_GET_SIZE`
- :c:func:`PyUnicode_GetSize`
- :c:func:`PyUnicode_GET_DATA_SIZE`
Remove the
PyUnicode_InternImmortal()function and theSSTATE_INTERNED_IMMORTALmacro. (Contributed by Victor Stinner in :gh:`85858`.)