What’s New In Python 3.11¶
- Editor:
Pablo Galindo Salgado
This article explains the new features in Python 3.11, compared to 3.10.Python 3.11 was released on October 24, 2022.For full details, see thechangelog.
Summary – Release highlights¶
Python 3.11 is between 10-60% faster than Python 3.10.On average, we measured a 1.25x speedup on the standard benchmark suite.SeeFaster CPython for details.
New syntax features:
New built-in features:
New standard library modules:
Interpreter improvements:
New
-P
command line option andPYTHONSAFEPATH
environmentvariable todisable automatically prepending potentially unsafe paths tosys.path
New typing features:
Important deprecations, removals and restrictions:
New Features¶
PEP 657: Fine-grained error locations in tracebacks¶
When printing tracebacks, the interpreter will now point to the exact expressionthat caused the error, instead of just the line. For example:
Traceback(mostrecentcalllast):File"distance.py",line11,in<module>print(manhattan_distance(p1,p2))^^^^^^^^^^^^^^^^^^^^^^^^^^File"distance.py",line6,inmanhattan_distancereturnabs(point_1.x-point_2.x)+abs(point_1.y-point_2.y)^^^^^^^^^AttributeError:'NoneType'objecthasnoattribute'x'
Previous versions of the interpreter would point to just the line, making itambiguous which object wasNone
. These enhanced errors can also be helpfulwhen dealing with deeply nesteddict
objects and multiple function calls:
Traceback(mostrecentcalllast):File"query.py",line37,in<module>magic_arithmetic('foo')File"query.py",line18,inmagic_arithmeticreturnadd_counts(x)/25^^^^^^^^^^^^^File"query.py",line24,inadd_countsreturn25+query_user(user1)+query_user(user2)^^^^^^^^^^^^^^^^^File"query.py",line32,inquery_userreturn1+query_count(db,response['a']['b']['c']['user'],retry=True)~~~~~~~~~~~~~~~~~~^^^^^TypeError:'NoneType'objectisnotsubscriptable
As well as complex arithmetic expressions:
Traceback(mostrecentcalllast):File"calculation.py",line54,in<module>result=(x/y/z)*(a/b/c)~~~~~~^~~ZeroDivisionError:divisionbyzero
Additionally, the information used by the enhanced traceback featureis made available via a general API, that can be used to correlatebytecodeinstructions with source code location.This information can be retrieved using:
The
codeobject.co_positions()
method in Python.The
PyCode_Addr2Location()
function in the C API.
SeePEP 657 for more details. (Contributed by Pablo Galindo, Batuhan Taskayaand Ammar Askar inbpo-43950.)
Note
This feature requires storing column positions inCode Objects,which may result in a small increase in interpreter memory usageand disk usage for compiled Python files.To avoid storing the extra informationand deactivate printing the extra traceback information,use the-Xno_debug_ranges
command line optionor thePYTHONNODEBUGRANGES
environment variable.
PEP 654: Exception Groups andexcept*
¶
PEP 654 introduces language features that enable a programto raise and handle multiple unrelated exceptions simultaneously.The builtin typesExceptionGroup
andBaseExceptionGroup
make it possible to group exceptions and raise them together,and the newexcept*
syntax generalizesexcept
to match subgroups of exception groups.
SeePEP 654 for more details.
(Contributed by Irit Katriel inbpo-45292. PEP written byIrit Katriel, Yury Selivanov and Guido van Rossum.)
PEP 678: Exceptions can be enriched with notes¶
Theadd_note()
method is added toBaseException
.It can be used to enrich exceptions with context informationthat is not available at the time when the exception is raised.The added notes appear in the default traceback.
SeePEP 678 for more details.
(Contributed by Irit Katriel inbpo-45607.PEP written by Zac Hatfield-Dodds.)
Windowspy.exe
launcher improvements¶
The copy of thePython Launcher for Windows included with Python 3.11 has been significantlyupdated. It now supports company/tag syntax as defined inPEP 514 using the-V:<company>/<tag>
argument instead of the limited-<major>.<minor>
.This allows launching distributions other thanPythonCore
,the one hosted onpython.org.
When using-V:
selectors, either company or tag can be omitted, but allinstalls will be searched. For example,-V:OtherPython/
will select the“best” tag registered forOtherPython
, while-V:3.11
or-V:/3.11
will select the “best” distribution with tag3.11
.
When using the legacy-<major>
,-<major>.<minor>
,-<major>-<bitness>
or-<major>.<minor>-<bitness>
arguments,all existing behaviour should be preserved from past versions,and only releases fromPythonCore
will be selected.However, the-64
suffix now implies “not 32-bit” (not necessarily x86-64),as there are multiple supported 64-bit platforms.32-bit runtimes are detected by checking the runtime’s tag for a-32
suffix.All releases of Python since 3.5 have included this in their 32-bit builds.
New Features Related to Type Hints¶
This section covers major changes affectingPEP 484 type hints andthetyping
module.
PEP 646: Variadic generics¶
PEP 484 previously introducedTypeVar
, enabling creationof generics parameterised with a single type.PEP 646 addsTypeVarTuple
, enabling parameterisationwith anarbitrary number of types. In other words,aTypeVarTuple
is avariadic type variable,enablingvariadic generics.
This enables a wide variety of use cases.In particular, it allows the type of array-like structuresin numerical computing libraries such as NumPy and TensorFlow to beparameterised with the arrayshape. Static type checkers will nowbe able to catch shape-related bugs in code that uses these libraries.
SeePEP 646 for more details.
(Contributed by Matthew Rahtz inbpo-43224, with contributions bySerhiy Storchaka and Jelle Zijlstra. PEP written by Mark Mendoza, MatthewRahtz, Pradeep Kumar Srinivasan, and Vincent Siles.)
PEP 655: Marking individualTypedDict
items as required or not-required¶
Required
andNotRequired
provide astraightforward way to mark whether individual items in aTypedDict
must be present. Previously, this was only possibleusing inheritance.
All fields are still required by default,unless thetotal parameter is set toFalse
,in which case all fields are still not-required by default.For example, the following specifies aTypedDict
with one required and one not-required key:
classMovie(TypedDict):title:stryear:NotRequired[int]m1:Movie={"title":"Black Panther","year":2018}# OKm2:Movie={"title":"Star Wars"}# OK (year is not required)m3:Movie={"year":2022}# ERROR (missing required field title)
The following definition is equivalent:
classMovie(TypedDict,total=False):title:Required[str]year:int
SeePEP 655 for more details.
(Contributed by David Foster and Jelle Zijlstra inbpo-47087. PEPwritten by David Foster.)
PEP 673:Self
type¶
The newSelf
annotation provides a simple and intuitiveway to annotate methods that return an instance of their class. Thisbehaves the same as theTypeVar
-based approachspecified in PEP 484,but is more concise and easier to follow.
Common use cases include alternative constructors provided asclassmethod
s,and__enter__()
methods that returnself
:
classMyLock:def__enter__(self)->Self:self.lock()returnself...classMyInt:@classmethoddeffromhex(cls,s:str)->Self:returncls(int(s,16))...
Self
can also be used to annotate method parametersor attributes of the same type as their enclosing class.
SeePEP 673 for more details.
(Contributed by James Hilton-Balfe inbpo-46534. PEP written byPradeep Kumar Srinivasan and James Hilton-Balfe.)
PEP 675: Arbitrary literal string type¶
The newLiteralString
annotation may be used to indicatethat a function parameter can be of any literal string type. This allowsa function to accept arbitrary literal string types, as well as stringscreated from other literal strings. Type checkers can thenenforce that sensitive functions, such as those that execute SQLstatements or shell commands, are called only with static arguments,providing protection against injection attacks.
For example, a SQL query function could be annotated as follows:
defrun_query(sql:LiteralString)->......defcaller(arbitrary_string:str,query_string:LiteralString,table_name:LiteralString,)->None:run_query("SELECT * FROM students")# okrun_query(query_string)# okrun_query("SELECT * FROM "+table_name)# okrun_query(arbitrary_string)# type checker errorrun_query(# type checker errorf"SELECT * FROM students WHERE name ={arbitrary_string}")
SeePEP 675 for more details.
(Contributed by Jelle Zijlstra inbpo-47088. PEP written by PradeepKumar Srinivasan and Graham Bleaney.)
PEP 681: Data class transforms¶
dataclass_transform
may be used todecorate a class, metaclass, or a function that is itself a decorator.The presence of@dataclass_transform()
tells a static type checker that thedecorated object performs runtime “magic” that transforms a class,giving itdataclass
-like behaviors.
For example:
# The create_model decorator is defined by a library.@typing.dataclass_transform()defcreate_model(cls:Type[T])->Type[T]:cls.__init__=...cls.__eq__=...cls.__ne__=...returncls# The create_model decorator can now be used to create new model classes:@create_modelclassCustomerModel:id:intname:strc=CustomerModel(id=327,name="Eric Idle")
SeePEP 681 for more details.
(Contributed by Jelle Zijlstra ingh-91860. PEP written byErik De Bonte and Eric Traut.)
PEP 563 may not be the future¶
PEP 563 Postponed Evaluation of Annotations(thefrom__future__importannotations
future statement)that was originally planned for release in Python 3.10has been put on hold indefinitely.Seethis message from the Steering Councilfor more information.
Other Language Changes¶
Starred unpacking expressions can now be used in
for
statements.(Seebpo-46725 for more details.)Asynchronouscomprehensions are now allowedinside comprehensions inasynchronous functions.Outer comprehensions implicitly become asynchronous in this case.(Contributed by Serhiy Storchaka inbpo-33346.)
A
TypeError
is now raised instead of anAttributeError
inwith
statements andcontextlib.ExitStack.enter_context()
for objects that do not support thecontext manager protocol,and inasyncwith
statements andcontextlib.AsyncExitStack.enter_async_context()
for objects not supporting theasynchronous context manager protocol.(Contributed by Serhiy Storchaka inbpo-12022 andbpo-44471.)Added
object.__getstate__()
, which provides the defaultimplementation of the__getstate__()
method.copy
ingandpickle
ing instances of subclasses of builtin typesbytearray
,set
,frozenset
,collections.OrderedDict
,collections.deque
,weakref.WeakSet
, anddatetime.tzinfo
now copies andpickles instance attributes implemented asslots.This change has an unintended side effect: It trips up a small minorityof existing Python projects not expectingobject.__getstate__()
toexist. See the later comments ongh-70766 for discussions of whatworkarounds such code may need.(Contributed by Serhiy Storchaka inbpo-26579.)
Added a
-P
command line optionand aPYTHONSAFEPATH
environment variable,which disable the automatic prepending tosys.path
of the script’s directory when running a script,or the current directory when using-c
and-m
.This ensures only stdlib and installed modulesare picked up byimport
,and avoids unintentionally or maliciously shadowing moduleswith those in a local (and typically user-writable) directory.(Contributed by Victor Stinner ingh-57684.)A
"z"
option was added to theFormat Specification Mini-Language thatcoerces negative to positive zero after rounding to the format precision.SeePEP 682 for more details.(Contributed by John Belmonte ingh-90153.)Bytes are no longer accepted on
sys.path
. Support broke sometimebetween Python 3.2 and 3.6, with no one noticing until after Python 3.10.0was released. In addition, bringing back support would be problematic due tointeractions between-b
andsys.path_importer_cache
whenthere is a mixture ofstr
andbytes
keys.(Contributed by Thomas Grainger ingh-91181.)
Other CPython Implementation Changes¶
The special methods
__complex__()
forcomplex
and__bytes__()
forbytes
are implemented to supportthetyping.SupportsComplex
andtyping.SupportsBytes
protocols.(Contributed by Mark Dickinson and Donghee Na inbpo-24234.)siphash13
is added as a new internal hashing algorithm.It has similar security properties assiphash24
,but it is slightly faster for long inputs.str
,bytes
, and some other typesnow use it as the default algorithm forhash()
.PEP 552hash-based .pyc filesnow usesiphash13
too.(Contributed by Inada Naoki inbpo-29410.)When an active exception is re-raised by a
raise
statement with no parameters,the traceback attached to this exception is now alwayssys.exc_info()[1].__traceback__
.This means that changes made to the traceback in the currentexcept
clause arereflected in the re-raised exception.(Contributed by Irit Katriel inbpo-45711.)The interpreter state’s representation of handled exceptions(aka
exc_info
or_PyErr_StackItem
)now only has theexc_value
field;exc_type
andexc_traceback
have been removed, as they can be derived fromexc_value
.(Contributed by Irit Katriel inbpo-45711.)A newcommand line option,
AppendPath
,has been added for the Windows installer.It behaves similarly toPrependPath
,but appends the install and scripts directories instead of prepending them.(Contributed by Bastian Neuburger inbpo-44934.)The
PyConfig.module_search_paths_set
field must now be set to1
forinitialization to usePyConfig.module_search_paths
to initializesys.path
. Otherwise, initialization will recalculate the path and replaceany values added tomodule_search_paths
.The output of the
--help
option now fits in 50 lines/80 columns.Information aboutPython environment variablesand-X
options is now available using the respective--help-env
and--help-xoptions
flags,and with the new--help-all
.(Contributed by Éric Araujo inbpo-46142.)Converting between
int
andstr
in bases other than 2(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)now raises aValueError
if the number of digits in string form isabove a limit to avoid potential denial of service attacks due to thealgorithmic complexity. This is a mitigation forCVE 2020-10735.This limit can be configured or disabled by environment variable, commandline flag, orsys
APIs. See theinteger string conversionlength limitation documentation. The default limitis 4300 digits in string form.
New Modules¶
Improved Modules¶
asyncio¶
Added the
TaskGroup
class,anasynchronous context managerholding a group of tasks that will wait for all of them upon exit.For new code this is recommended over usingcreate_task()
andgather()
directly.(Contributed by Yury Selivanov and others ingh-90908.)Added
timeout()
, an asynchronous context manager forsetting a timeout on asynchronous operations. For new code this isrecommended over usingwait_for()
directly.(Contributed by Andrew Svetlov ingh-90927.)Added the
Runner
class, which exposes the machineryused byrun()
.(Contributed by Andrew Svetlov ingh-91218.)Added the
Barrier
class to the synchronizationprimitives in the asyncio library, and the relatedBrokenBarrierError
exception.(Contributed by Yves Duprat and Andrew Svetlov ingh-87518.)Added keyword argumentall_errors to
asyncio.loop.create_connection()
so that multiple connection errors can be raised as anExceptionGroup
.Added the
asyncio.StreamWriter.start_tls()
method forupgrading existing stream-based connections to TLS.(Contributed by Ian Good inbpo-34975.)Added raw datagram socket functions to the event loop:
sock_sendto()
,sock_recvfrom()
andsock_recvfrom_into()
.These have implementations inSelectorEventLoop
andProactorEventLoop
.(Contributed by Alex Grönholm inbpo-46805.)Added
cancelling()
anduncancel()
methods toTask
.These are primarily intended for internal use,notably byTaskGroup
.
contextlib¶
dataclasses¶
datetime¶
Add
datetime.UTC
, a convenience alias fordatetime.timezone.utc
. (Contributed by Kabir Kwatra ingh-91973.)datetime.date.fromisoformat()
,datetime.time.fromisoformat()
anddatetime.datetime.fromisoformat()
can now be used to parse most ISO 8601formats (barring only those that support fractional hours and minutes).(Contributed by Paul Ganssle ingh-80010.)
enum¶
Renamed
EnumMeta
toEnumType
(EnumMeta
kept as an alias).Added
StrEnum
,with members that can be used as (and must be) strings.Added
ReprEnum
,which only modifies the__repr__()
of memberswhile returning their literal values (rather than names)for__str__()
and__format__()
(used bystr()
,format()
andf-strings).Changed
Enum.__format__()
(the default forformat()
,str.format()
andf-strings) to always producethe same result asEnum.__str__()
: for enums inheriting fromReprEnum
it will be the member’s value; for all other enumsit will be the enum and member name (e.g.Color.RED
).Added a newboundary class parameter to
Flag
enumsand theFlagBoundary
enum with its options,to control how to handle out-of-range flag values.Added the
verify()
enum decoratorand theEnumCheck
enum with its options,to check enum classes against several specific constraints.Added the
member()
andnonmember()
decorators,to ensure the decorated object is/is not converted to an enum member.Added the
property()
decorator,which works likeproperty()
except for enums.Use this instead oftypes.DynamicClassAttribute()
.Added the
global_enum()
enum decorator,which adjusts__repr__()
and__str__()
to show values as members of their module rather than the enum class.For example,'re.ASCII'
for theASCII
memberofre.RegexFlag
rather than'RegexFlag.ASCII'
.Enhanced
Flag
to supportlen()
, iteration andin
/notin
on its members.For example, the following now works:len(AFlag(3))==2andlist(AFlag(3))==(AFlag.ONE,AFlag.TWO)
Changed
Enum
andFlag
so that members are now definedbefore__init_subclass__()
is called;dir()
now includes methods, etc., from mixed-in data types.Changed
Flag
to only consider primary values (power of two) canonicalwhile composite values (3
,6
,10
, etc.) are considered aliases;inverted flags are coerced to their positive equivalent.
fcntl¶
On FreeBSD, the
F_DUP2FD
andF_DUP2FD_CLOEXEC
flags respectivelyare supported, the former equals todup2
usage while the latter settheFD_CLOEXEC
flag in addition.
fractions¶
functools¶
functools.singledispatch()
now supportstypes.UnionType
andtyping.Union
as annotations to the dispatch argument.:>>>fromfunctoolsimportsingledispatch>>>@singledispatch...deffun(arg,verbose=False):...ifverbose:...print("Let me just say,",end=" ")...print(arg)...>>>@fun.register...def_(arg:int|float,verbose=False):...ifverbose:...print("Strength in numbers, eh?",end=" ")...print(arg)...>>>fromtypingimportUnion>>>@fun.register...def_(arg:Union[list,set],verbose=False):...ifverbose:...print("Enumerate this:")...fori,eleminenumerate(arg):...print(i,elem)...
(Contributed by Yurii Karabas inbpo-46014.)
gzip¶
The
gzip.compress()
function is now faster when used with themtime=0 argument as it delegates the compression entirely to a singlezlib.compress()
operation. There is one side effect of this change: Thegzip file header contains an “OS” byte in its header. That was traditionallyalways set to a value of 255 representing “unknown” by thegzip
module. Now, when usingcompress()
withmtime=0, it may beset to a different value by the underlying zlib C library Python was linkedagainst.(Seegh-112346 for details on the side effect.)
hashlib¶
hashlib.blake2b()
andhashlib.blake2s()
now preferlibb2over Python’s vendored copy.(Contributed by Christian Heimes inbpo-47095.)The internal
_sha3
module with SHA3 and SHAKE algorithms now usestiny_sha3 instead of theKeccak Code Package to reduce code and binarysize. Thehashlib
module prefers optimized SHA3 and SHAKEimplementations from OpenSSL. The change affects only installations withoutOpenSSL support.(Contributed by Christian Heimes inbpo-47098.)Add
hashlib.file_digest()
, a helper function for efficient hashingof files or file-like objects.(Contributed by Christian Heimes ingh-89313.)
IDLE and idlelib¶
inspect¶
Add
getmembers_static()
to return all members withouttriggering dynamic lookup via the descriptor protocol. (Contributed byWeipeng Hong inbpo-30533.)Add
ismethodwrapper()
for checking if the type of an object is aMethodWrapperType
.(Contributed by Hakan Çelik inbpo-29418.)Change the frame-related functions in the
inspect
module to return newFrameInfo
andTraceback
class instances(backwards compatible with the previousnamed tuple-like interfaces)that includes the extendedPEP 657 position information (endline number, column and end column). The affected functions are:(Contributed by Pablo Galindo ingh-88116.)
locale¶
Add
locale.getencoding()
to get the current locale encoding. It is similar tolocale.getpreferredencoding(False)
but ignores thePython UTF-8 Mode.
logging¶
Added
getLevelNamesMapping()
to return a mapping from logging level names (e.g.'CRITICAL'
)to the values of their correspondingLogging Levels (e.g.50
, by default).(Contributed by Andrei Kulakovin ingh-88024.)Added a
createSocket()
methodtoSysLogHandler
, to matchSocketHandler.createSocket()
.It is called automatically during handler initializationand when emitting an event, if there is no active socket.(Contributed by Kirill Pinchuk ingh-88457.)
math¶
Add
math.exp2()
: return 2 raised to the power of x.(Contributed by Gideon Mitchell inbpo-45917.)Add
math.cbrt()
: return the cube root of x.(Contributed by Ajith Ramachandran inbpo-44357.)The behaviour of two
math.pow()
corner cases was changed, forconsistency with the IEEE 754 specification. The operationsmath.pow(0.0,-math.inf)
andmath.pow(-0.0,-math.inf)
now returninf
. Previously they raisedValueError
. (Contributed by MarkDickinson inbpo-44339.)The
math.nan
value is now always available.(Contributed by Victor Stinner inbpo-46917.)
operator¶
A new function
operator.call
has been added, such thatoperator.call(obj,*args,**kwargs)==obj(*args,**kwargs)
.(Contributed by Antony Lee inbpo-44019.)
os¶
On Windows,
os.urandom()
now usesBCryptGenRandom()
,instead ofCryptGenRandom()
which is deprecated.(Contributed by Donghee Na inbpo-44611.)
pathlib¶
re¶
Atomic grouping (
(?>...)
) and possessive quantifiers (*+
,++
,?+
,{m,n}+
) are now supported in regular expressions.(Contributed by Jeffrey C. Jacobs and Serhiy Storchaka inbpo-433030.)
shutil¶
Add optional parameterdir_fd in
shutil.rmtree()
.(Contributed by Serhiy Storchaka inbpo-46245.)
socket¶
Add CAN Socket support for NetBSD.(Contributed by Thomas Klausner inbpo-30512.)
create_connection()
has an option to raise, in case offailure to connect, anExceptionGroup
containing all errorsinstead of only raising the last error.(Contributed by Irit Katriel inbpo-29980.)
sqlite3¶
You can now disable the authorizer by passing
None
toset_authorizer()
.(Contributed by Erlend E. Aasland inbpo-44491.)Collation name
create_collation()
can nowcontain any Unicode character. Collation names with invalid charactersnow raiseUnicodeEncodeError
instead ofsqlite3.ProgrammingError
.(Contributed by Erlend E. Aasland inbpo-44688.)sqlite3
exceptions now include the SQLite extended error code assqlite_errorcode
and the SQLite error name assqlite_errorname
.(Contributed by Aviv Palivoda, Daniel Shahaf, and Erlend E. Aasland inbpo-16379 andbpo-24139.)Add
setlimit()
andgetlimit()
tosqlite3.Connection
forsetting and getting SQLite limits by connection basis.(Contributed by Erlend E. Aasland inbpo-45243.)sqlite3
now setssqlite3.threadsafety
based on the defaultthreading mode the underlying SQLite library has been compiled with.(Contributed by Erlend E. Aasland inbpo-45613.)sqlite3
C callbacks now use unraisable exceptions if callbacktracebacks are enabled. Users can now register anunraisablehookhandler
to improve their debugexperience.(Contributed by Erlend E. Aasland inbpo-45828.)Fetch across rollback no longer raises
InterfaceError
.Instead we leave it to the SQLite library to handle these cases.(Contributed by Erlend E. Aasland inbpo-44092.)Add
serialize()
anddeserialize()
tosqlite3.Connection
forserializing and deserializing databases.(Contributed by Erlend E. Aasland inbpo-41930.)Add
create_window_function()
tosqlite3.Connection
for creating aggregate window functions.(Contributed by Erlend E. Aasland inbpo-34916.)Add
blobopen()
tosqlite3.Connection
.sqlite3.Blob
allows incremental I/O operations on blobs.(Contributed by Aviv Palivoda and Erlend E. Aasland inbpo-24905.)
string¶
Add
get_identifiers()
andis_valid()
tostring.Template
,which respectively return all valid placeholders,and whether any invalid placeholders are present.(Contributed by Ben Kehoe ingh-90465.)
sys¶
sys.exc_info()
now derives thetype
andtraceback
fieldsfrom thevalue
(the exception instance), so when an exception ismodified while it is being handled, the changes are reflected inthe results of subsequent calls toexc_info()
.(Contributed by Irit Katriel inbpo-45711.)Add
sys.exception()
which returns the active exception instance(equivalent tosys.exc_info()[1]
).(Contributed by Irit Katriel inbpo-46328.)Add the
sys.flags.safe_path
flag.(Contributed by Victor Stinner ingh-57684.)
sysconfig¶
Three newinstallation schemes(posix_venv,nt_venv andvenv) were added and are used when Pythoncreates new virtual environments or when it is running from a virtualenvironment.The first two schemes (posix_venv andnt_venv) are OS-specificfor non-Windows and Windows, thevenv is essentially an alias to one ofthem according to the OS Python runs on.This is useful for downstream distributors who modify
sysconfig.get_preferred_scheme()
.Third party code that creates new virtual environments should use the newvenv installation scheme to determine the paths, as doesvenv
.(Contributed by Miro Hrončok inbpo-45413.)
tempfile¶
SpooledTemporaryFile
objects now fully implement the methodsofio.BufferedIOBase
orio.TextIOBase
(depending on file mode).This lets them work correctly with APIs that expect file-like objects,such as compression modules.(Contributed by Carey Metcalfe ingh-70363.)
threading¶
On Unix, if the
sem_clockwait()
function is available in the C library(glibc 2.30 and newer), thethreading.Lock.acquire()
method now usesthe monotonic clock (time.CLOCK_MONOTONIC
) for the timeout, ratherthan using the system clock (time.CLOCK_REALTIME
), to not be affectedby system clock changes.(Contributed by Victor Stinner inbpo-41710.)
time¶
On Unix,
time.sleep()
now uses theclock_nanosleep()
ornanosleep()
function, if available, which has a resolution of 1 nanosecond(10-9 seconds), rather than usingselect()
which has a resolutionof 1 microsecond (10-6 seconds).(Contributed by Benjamin Szőke and Victor Stinner inbpo-21302.)On Windows 8.1 and newer,
time.sleep()
now uses a waitable timer basedonhigh-resolution timerswhich has a resolution of 100 nanoseconds (10-7 seconds). Previously,it had a resolution of 1 millisecond (10-3 seconds).(Contributed by Benjamin Szőke, Donghee Na, Eryk Sun and Victor Stinner inbpo-21302 andbpo-45429.)
tkinter¶
Added method
info_patchlevel()
which returns the exact version ofthe Tcl library as a named tuple similar tosys.version_info
.(Contributed by Serhiy Storchaka ingh-91827.)
traceback¶
Add
traceback.StackSummary.format_frame_summary()
to allow usersto override which frames appear in the traceback, and how they areformatted.(Contributed by Ammar Askar inbpo-44569.)Add
traceback.TracebackException.print()
, which prints theformattedTracebackException
instance to a file.(Contributed by Irit Katriel inbpo-33809.)
typing¶
For major changes, seeNew Features Related to Type Hints.
Add
typing.assert_never()
andtyping.Never
.typing.assert_never()
is useful for asking a type checker to confirmthat a line of code is not reachable. At runtime, it raises anAssertionError
.(Contributed by Jelle Zijlstra ingh-90633.)Add
typing.reveal_type()
. This is useful for asking a type checkerwhat type it has inferred for a given expression. At runtime it printsthe type of the received value.(Contributed by Jelle Zijlstra ingh-90572.)Add
typing.assert_type()
. This is useful for asking a type checkerto confirm that the type it has inferred for a given expression matchesthe given type. At runtime it simply returns the received value.(Contributed by Jelle Zijlstra ingh-90638.)typing.TypedDict
types can now be generic. (Contributed bySamodya Abeysiriwardane ingh-89026.)NamedTuple
types can now be generic.(Contributed by Serhiy Storchaka inbpo-43923.)Allow subclassing of
typing.Any
. This is useful for avoidingtype checker errors related to highly dynamic class, such as mocks.(Contributed by Shantanu Jain ingh-91154.)The
typing.final()
decorator now sets the__final__
attributed onthe decorated object.(Contributed by Jelle Zijlstra ingh-90500.)The
typing.get_overloads()
function can be used for introspectingthe overloads of a function.typing.clear_overloads()
can be usedto clear all registered overloads of a function.(Contributed by Jelle Zijlstra ingh-89263.)The
__init__()
method ofProtocol
subclassesis now preserved. (Contributed by Adrian Garcia Badarasco ingh-88970.)The representation of empty tuple types (
Tuple[()]
) is simplified.This affects introspection, e.g.get_args(Tuple[()])
now evaluatesto()
instead of((),)
.(Contributed by Serhiy Storchaka ingh-91137.)Loosen runtime requirements for type annotations by removing the callablecheck in the private
typing._type_check
function. (Contributed byGregory Beauregard ingh-90802.)typing.get_type_hints()
now supports evaluating strings as forwardreferences inPEP 585 generic aliases.(Contributed by Niklas Rosenstein ingh-85542.)typing.get_type_hints()
no longer addsOptional
to parameters withNone
as a default. (Contributed by Nikita Sobolevingh-90353.)typing.get_type_hints()
now supports evaluating bare stringifiedClassVar
annotations. (Contributed by Gregory Beauregardingh-90711.)typing.no_type_check()
no longer modifies external classes and functions.It also now correctly marks classmethods as not to be type checked. (Contributedby Nikita Sobolev ingh-90729.)
unicodedata¶
The Unicode database has been updated to version 14.0.0.(Contributed by Benjamin Peterson inbpo-45190).
unittest¶
Added methods
enterContext()
andenterClassContext()
of classTestCase
, methodenterAsyncContext()
ofclassIsolatedAsyncioTestCase
and functionunittest.enterModuleContext()
.(Contributed by Serhiy Storchaka inbpo-45046.)
venv¶
When new Python virtual environments are created, thevenvsysconfig installation scheme is usedto determine the paths inside the environment.When Python runs in a virtual environment, the same installation schemeis the default.That means that downstream distributors can change the default sysconfig installscheme without changing behavior of virtual environments.Third party code that also creates new virtual environments should do the same.(Contributed by Miro Hrončok inbpo-45413.)
warnings¶
warnings.catch_warnings()
now accepts arguments forwarnings.simplefilter()
,providing a more concise way to locally ignore warnings or convert them to errors.(Contributed by Zac Hatfield-Dodds inbpo-47074.)
zipfile¶
Added support for specifying member name encoding for reading metadatain a
ZipFile
’s directory and file headers.(Contributed by Stephen J. Turnbull and Serhiy Storchaka inbpo-28080.)Added
ZipFile.mkdir()
for creating new directories inside ZIP archives.(Contributed by Sam Ezeh ingh-49083.)Added
stem
,suffix
andsuffixes
tozipfile.Path
.(Contributed by Miguel Brito ingh-88261.)
Optimizations¶
This section covers specific optimizations independent of theFaster CPython project, which is covered in its own section.
The compiler now optimizes simpleprintf-style % formatting on string literalscontaining only the format codes
%s
,%r
and%a
and makes it asfast as a correspondingf-string expression.(Contributed by Serhiy Storchaka inbpo-28307.)Integer division (
//
) is better tuned for optimization by compilers.It is now around 20% faster on x86-64 when dividing anint
by a value smaller than2**30
.(Contributed by Gregory P. Smith and Tim Peters ingh-90564.)sum()
is now nearly 30% faster for integers smaller than2**30
.(Contributed by Stefan Behnel ingh-68264.)Resizing lists is streamlined for the common case,speeding up
list.append()
by ≈15%and simplelist comprehensions by up to 20-30%(Contributed by Dennis Sweeney ingh-91165.)Dictionaries don’t store hash values when all keys are Unicode objects,decreasing
dict
size.For example,sys.getsizeof(dict.fromkeys("abcdefg"))
is reduced from 352 bytes to 272 bytes (23% smaller) on 64-bit platforms.(Contributed by Inada Naoki inbpo-46845.)Using
asyncio.DatagramProtocol
is now orders of magnitude fasterwhen transferring large files over UDP,with speeds over 100 times higher for a ≈60 MiB file.(Contributed by msoxzw ingh-91487.)math
functionscomb()
andperm()
are now≈10 times faster for large arguments (with a larger speedup for largerk).(Contributed by Serhiy Storchaka inbpo-37295.)The
statistics
functionsmean()
,variance()
andstdev()
now consumeiterators in one pass rather than converting them to alist
first.This is twice as fast and can save substantial memory.(Contributed by Raymond Hettinger ingh-90415.)unicodedata.normalize()
now normalizes pure-ASCII strings in constant time.(Contributed by Donghee Na inbpo-44987.)
Faster CPython¶
CPython 3.11 is an average of25% fasterthan CPython 3.10 as measured with thepyperformance benchmark suite,when compiled with GCC on Ubuntu Linux.Depending on your workload, the overall speedup could be 10-60%.
This project focuses on two major areas in Python:Faster Startup andFaster Runtime.Optimizations not covered by this project are listed separately underOptimizations.
Faster Startup¶
Frozen imports / Static code objects¶
Python cachesbytecode in the__pycache__directory to speed up module loading.
Previously in 3.10, Python module execution looked like this:
Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate
In Python 3.11, the core modules essential for Python startup are “frozen”.This means that theirCode Objects (and bytecode)are statically allocated by the interpreter.This reduces the steps in module execution process to:
Statically allocated code object -> Evaluate
Interpreter startup is now 10-15% faster in Python 3.11. This has a bigimpact for short-running programs using Python.
(Contributed by Eric Snow, Guido van Rossum and Kumar Aditya in many issues.)
Faster Runtime¶
Cheaper, lazy Python frames¶
Python frames, holding execution information,are created whenever Python calls a Python function.The following are new frame optimizations:
Streamlined the frame creation process.
Avoided memory allocation by generously re-using frame space on the C stack.
Streamlined the internal frame struct to contain only essential information.Frames previously held extra debugging and memory management information.
Old-styleframe objectsare now created only when requested by debuggersor by Python introspection functions such assys._getframe()
andinspect.currentframe()
. For most user code, no frame objects arecreated at all. As a result, nearly all Python functions calls have spedup significantly. We measured a 3-7% speedup in pyperformance.
(Contributed by Mark Shannon inbpo-44590.)
Inlined Python function calls¶
During a Python function call, Python will call an evaluating C function tointerpret that function’s code. This effectively limits pure Python recursion towhat’s safe for the C stack.
In 3.11, when CPython detects Python code calling another Python function,it sets up a new frame, and “jumps” to the new code inside the new frame. Thisavoids calling the C interpreting function altogether.
Most Python function calls now consume no C stack space, speeding them up.In simple recursive functions like fibonacci orfactorial, we observed a 1.7x speedup. This also means recursive functionscan recurse significantly deeper(if the user increases the recursion limit withsys.setrecursionlimit()
).We measured a 1-3% improvement in pyperformance.
(Contributed by Pablo Galindo and Mark Shannon inbpo-45256.)
PEP 659: Specializing Adaptive Interpreter¶
PEP 659 is one of the key parts of the Faster CPython project. The generalidea is that while Python is a dynamic language, most code has regions whereobjects and types rarely change. This concept is known astype stability.
At runtime, Python will try to look for common patterns and type stabilityin the executing code. Python will then replace the current operation with amore specialized one. This specialized operation uses fast paths available onlyto those use cases/types, which generally outperform their genericcounterparts. This also brings in another concept calledinline caching, wherePython caches the results of expensive operations directly in thebytecode.
The specializer will also combine certain common instruction pairs into onesuperinstruction, reducing the overhead during execution.
Python will only specializewhen it sees code that is “hot” (executed multiple times). This prevents Pythonfrom wasting time on run-once code. Python can also de-specialize when code istoo dynamic or when the use changes. Specialization is attempted periodically,and specialization attempts are not too expensive,allowing specialization to adapt to new circumstances.
(PEP written by Mark Shannon, with ideas inspired by Stefan Brunthaler.SeePEP 659 for more information. Implementation by Mark Shannon and BrandtBucher, with additional help from Irit Katriel and Dennis Sweeney.)
Operation | Form | Specialization | Operation speedup(up to) | Contributor(s) |
---|---|---|---|---|
Binaryoperations |
| Binary add, multiply and subtract for common typessuch as | 10% | Mark Shannon,Donghee Na,Brandt Bucher,Dennis Sweeney |
Subscript |
| Subscripting container types such as Subscripting custom | 10-25% | Irit Katriel,Mark Shannon |
Storesubscript |
| Similar to subscripting specialization above. | 10-25% | Dennis Sweeney |
Calls |
| Calls to common builtin (C) functions and types suchas | 20% | Mark Shannon,Ken Jin |
Loadglobalvariable |
| The object’s index in the globals/builtins namespaceis cached. Loading globals and builtins requirezero namespace lookups. | Mark Shannon | |
Loadattribute |
| Similar to loading global variables. The attribute’sindex inside the class/object’s namespace is cached.In most cases, attribute loading will require zeronamespace lookups. | Mark Shannon | |
Loadmethods forcall |
| The actual address of the method is cached. Methodloading now has no namespace lookups – even forclasses with long inheritance chains. | 10-20% | Ken Jin,Mark Shannon |
Storeattribute |
| Similar to load attribute optimization. | 2%in pyperformance | Mark Shannon |
UnpackSequence |
| Specialized for common containers such as | 8% | Brandt Bucher |
A similar optimization already existed since Python 3.8.3.11 specializes for more forms and reduces some overhead.
[2]A similar optimization already existed since Python 3.10.3.11 specializes for more forms. Furthermore, all attribute loads shouldbe sped up bybpo-45947.
Misc¶
Objects now require less memory due to lazily created object namespaces.Their namespace dictionaries now also share keys more freely.(Contributed Mark Shannon inbpo-45340 andbpo-40116.)
“Zero-cost” exceptions are implemented, eliminating the costof
try
statements when no exception is raised.(Contributed by Mark Shannon inbpo-40222.)A more concise representation of exceptions in the interpreter reduced thetime required for catching an exception by about 10%.(Contributed by Irit Katriel inbpo-45711.)
re
’s regular expression matching engine has been partially refactored,and now uses computed gotos (or “threaded code”) on supported platforms. As aresult, Python 3.11 executes thepyperformance regular expression benchmarks up to 10%faster than Python 3.10.(Contributed by Brandt Bucher ingh-91404.)
FAQ¶
How should I write my code to utilize these speedups?¶
Write Pythonic code that follows common best practices;you don’t have to change your code.The Faster CPython project optimizes for common code patterns we observe.
Will CPython 3.11 use more memory?¶
Maybe not; we don’t expect memory use to exceed 20% higher than 3.10.This is offset by memory optimizations for frame objects and objectdictionaries as mentioned above.
I don’t see any speedups in my workload. Why?¶
Certain code won’t have noticeable benefits. If your code spends most ofits time on I/O operations, or already does most of itscomputation in a C extension library like NumPy, there won’t be significantspeedups. This project currently benefits pure-Python workloads the most.
Furthermore, the pyperformance figures are a geometric mean. Even within thepyperformance benchmarks, certain benchmarks have slowed down slightly, whileothers have sped up by nearly 2x!
Is there a JIT compiler?¶
No. We’re still exploring other optimizations.
About¶
Faster CPython explores optimizations forCPython. The main team isfunded by Microsoft to work on this full-time. Pablo Galindo Salgado is alsofunded by Bloomberg LP to work on the project part-time. Finally, manycontributors are volunteers from the community.
CPython bytecode changes¶
The bytecode now contains inline cache entries,which take the form of the newly-addedCACHE
instructions.Many opcodes expect to be followed by an exact number of caches,and instruct the interpreter to skip over them at runtime.Populated caches can look like arbitrary instructions,so great care should be taken when reading or modifyingraw, adaptive bytecode containing quickened data.
New opcodes¶
ASYNC_GEN_WRAP
,RETURN_GENERATOR
andSEND
,used in generators and co-routines.COPY_FREE_VARS
,which avoids needing special caller-side code for closures.JUMP_BACKWARD_NO_INTERRUPT
,for use in certain loops where handling interrupts is undesirable.MAKE_CELL
, to createCell Objects.CHECK_EG_MATCH
andPREP_RERAISE_STAR
,to handle thenew exception groups and except*added inPEP 654.PUSH_EXC_INFO
, for use in exception handlers.RESUME
, a no-op,for internal tracing, debugging and optimization checks.
Replaced opcodes¶
Replaced Opcode(s) | New Opcode(s) | Notes |
---|---|---|
BINARY_* INPLACE_* | Replaced all numeric binary/in-placeopcodes with a single opcode | |
CALL_FUNCTION CALL_FUNCTION_KW CALL_METHOD | Decouples argument shifting for methodsfrom handling of keyword arguments;allows better specialization of calls | |
DUP_TOP DUP_TOP_TWO ROT_TWO ROT_THREE ROT_FOUR ROT_N | Stack manipulation instructions | |
JUMP_IF_NOT_EXC_MATCH | Now performs check but doesn’t jump | |
JUMP_ABSOLUTE POP_JUMP_IF_FALSE POP_JUMP_IF_TRUE | See[3]; | |
SETUP_WITH SETUP_ASYNC_WITH |
|
All jump opcodes are now relative, including theexistingJUMP_IF_TRUE_OR_POP
andJUMP_IF_FALSE_OR_POP
.The argument is now an offset from the current instructionrather than an absolute location.
Changed/removed opcodes¶
Changed
MATCH_CLASS
andMATCH_KEYS
to no longer push an additional boolean value to indicate success/failure.Instead,None
is pushed on failurein place of the tuple of extracted values.Changed opcodes that work with exceptions to reflect themnow being represented as one item on the stack instead of three(seegh-89874).
Removed
COPY_DICT_WITHOUT_KEYS
,GEN_START
,POP_BLOCK
,SETUP_FINALLY
andYIELD_FROM
.
Deprecated¶
This section lists Python APIs that have been deprecated in Python 3.11.
Deprecated C APIs arelisted separately.
Language/Builtins¶
Chaining
classmethod
descriptors (introduced inbpo-19072)is now deprecated. It can no longer be used to wrap other descriptorssuch asproperty
. The core design of this feature was flawedand caused a number of downstream problems. To “pass-through” aclassmethod
, consider using the__wrapped__
attributethat was added in Python 3.10.(Contributed by Raymond Hettinger ingh-89519.)Octal escapes in string and bytes literals with values larger than
0o377
(255 in decimal) now produce aDeprecationWarning
.In a future Python version, they will raise aSyntaxWarning
andeventually aSyntaxError
.(Contributed by Serhiy Storchaka ingh-81548.)The delegation of
int()
to__trunc__()
is now deprecated.Callingint(a)
whentype(a)
implements__trunc__()
but not__int__()
or__index__()
now raisesaDeprecationWarning
.(Contributed by Zackery Spytz inbpo-44977.)
Modules¶
PEP 594 led to the deprecations of the following modulesslated for removal in Python 3.13:
aifc
chunk
msilib
pipes
telnetlib
audioop
crypt
nis
sndhdr
uu
cgi
imghdr
nntplib
spwd
xdrlib
cgitb
mailcap
ossaudiodev
sunau
(Contributed by Brett Cannon inbpo-47061 and Victor Stinner ingh-68966.)
The
asynchat
,asyncore
andsmtpd
modules have beendeprecated since at least Python 3.6. Their documentation and deprecationwarnings have now been updated to note they will be removed in Python 3.12.(Contributed by Hugo van Kemenade inbpo-47022.)The
lib2to3
package and2to3
toolare now deprecated and may not be able to parse Python 3.10 or newer.SeePEP 617, introducing the new PEG parser, for details.(Contributed by Victor Stinner inbpo-40360.)Undocumented modules
sre_compile
,sre_constants
andsre_parse
are now deprecated.(Contributed by Serhiy Storchaka inbpo-47152.)
Standard Library¶
The following have been deprecated in
configparser
since Python 3.2.Their deprecation warnings have now been updated to note they will be removedin Python 3.12:the
configparser.SafeConfigParser
classthe
configparser.ParsingError.filename
propertythe
configparser.RawConfigParser.readfp()
method
(Contributed by Hugo van Kemenade inbpo-45173.)
configparser.LegacyInterpolation
has been deprecated in the docstringsince Python 3.2, and is not listed in theconfigparser
documentation.It now emits aDeprecationWarning
and will be removedin Python 3.13. Useconfigparser.BasicInterpolation
orconfigparser.ExtendedInterpolation
instead.(Contributed by Hugo van Kemenade inbpo-46607.)The older set of
importlib.resources
functions were deprecatedin favor of the replacements added in Python 3.9and will be removed in a future Python version,due to not supporting resources located within package subdirectories:importlib.resources.contents()
importlib.resources.is_resource()
importlib.resources.open_binary()
importlib.resources.open_text()
importlib.resources.read_binary()
importlib.resources.read_text()
importlib.resources.path()
The
locale.getdefaultlocale()
function is deprecated and will beremoved in Python 3.15. Uselocale.setlocale()
,locale.getpreferredencoding(False)
andlocale.getlocale()
functions instead.(Contributed by Victor Stinner ingh-90817.)The
locale.resetlocale()
function is deprecated and will beremoved in Python 3.13. Uselocale.setlocale(locale.LC_ALL,"")
instead.(Contributed by Victor Stinner ingh-90817.)Stricter rules will now be applied for numerical group referencesand group names inregular expressions.Only sequences of ASCII digits will now be accepted as a numerical reference,and the group name in
bytes
patterns and replacement stringscan only contain ASCII letters, digits and underscores.For now, a deprecation warning is raised for syntax violating these rules.(Contributed by Serhiy Storchaka ingh-91760.)In the
re
module, there.template()
functionand the correspondingre.TEMPLATE
andre.T
flagsare deprecated, as they were undocumented and lacked an obvious purpose.They will be removed in Python 3.13.(Contributed by Serhiy Storchaka and Miro Hrončok ingh-92728.)turtle.settiltangle()
has been deprecated since Python 3.1;it now emits a deprecation warning and will be removed in Python 3.13. Useturtle.tiltangle()
instead (it was earlier incorrectly markedas deprecated, and its docstring is now corrected).(Contributed by Hugo van Kemenade inbpo-45837.)typing.Text
, which exists solely to provide compatibility supportbetween Python 2 and Python 3 code, is now deprecated. Its removal iscurrently unplanned, but users are encouraged to usestr
insteadwherever possible.(Contributed by Alex Waygood ingh-92332.)The keyword argument syntax for constructing
typing.TypedDict
typesis now deprecated. Support will be removed in Python 3.13. (Contributed byJingchen Ye ingh-90224.)webbrowser.MacOSX
is deprecated and will be removed in Python 3.13.It is untested, undocumented, and not used bywebbrowser
itself.(Contributed by Donghee Na inbpo-42255.)The behavior of returning a value from a
TestCase
andIsolatedAsyncioTestCase
test methods (other than thedefaultNone
value) is now deprecated.Deprecated the following not-formally-documented
unittest
functions,scheduled for removal in Python 3.13:unittest.findTestCases()
unittest.makeSuite()
unittest.getTestCaseNames()
Use
TestLoader
methods instead:(Contributed by Erlend E. Aasland inbpo-5846.)
unittest.TestProgram.usageExit()
is marked deprecated, to be removedin 3.13.(Contributed by Carlos Damázio ingh-67048.)
Pending Removal in Python 3.12¶
The following Python APIs have been deprecated in earlier Python releases,and will be removed in Python 3.12.
C APIs pending removal arelisted separately.
The
asynchat
moduleThe
asyncore
moduleThe
imp
moduleThe
typing.io
namespaceThe
typing.re
namespacecgi.log()
importlib.find_loader()
importlib.abc.Loader.module_repr()
importlib.abc.MetaPathFinder.find_module()
importlib.abc.PathEntryFinder.find_loader()
importlib.abc.PathEntryFinder.find_module()
importlib.machinery.BuiltinImporter.find_module()
importlib.machinery.BuiltinLoader.module_repr()
importlib.machinery.FileFinder.find_loader()
importlib.machinery.FileFinder.find_module()
importlib.machinery.FrozenImporter.find_module()
importlib.machinery.FrozenLoader.module_repr()
importlib.machinery.PathFinder.find_module()
importlib.machinery.WindowsRegistryFinder.find_module()
importlib.util.module_for_loader()
importlib.util.set_loader_wrapper()
importlib.util.set_package_wrapper()
pkgutil.ImpImporter
pkgutil.ImpLoader
pathlib.Path.link_to()
sqlite3.enable_shared_cache()
sqlite3.OptimizedUnicode()
PYTHONTHREADDEBUG
environment variableThe following deprecated aliases in
unittest
:Deprecated alias
Method Name
Deprecated in
failUnless
3.1
failIf
3.1
failUnlessEqual
3.1
failIfEqual
3.1
failUnlessAlmostEqual
3.1
failIfAlmostEqual
3.1
failUnlessRaises
3.1
assert_
3.2
assertEquals
3.2
assertNotEquals
3.2
assertAlmostEquals
3.2
assertNotAlmostEquals
3.2
assertRegexpMatches
3.2
assertRaisesRegexp
3.2
assertNotRegexpMatches
3.5
Removed¶
This section lists Python APIs that have been removed in Python 3.11.
Removed C APIs arelisted separately.
Removed the
@asyncio.coroutine()
decoratorenabling legacy generator-based coroutines to be compatible withasync
/await
code.The function has been deprecated since Python 3.8 and the removal wasinitially scheduled for Python 3.10. Useasyncdef
instead.(Contributed by Illia Volochii inbpo-43216.)Removed
asyncio.coroutines.CoroWrapper
used for wrapping legacygenerator-based coroutine objects in the debug mode.(Contributed by Illia Volochii inbpo-43216.)Due to significant security concerns, thereuse_address parameter of
asyncio.loop.create_datagram_endpoint()
, disabled in Python 3.9, isnow entirely removed. This is because of the behavior of the socket optionSO_REUSEADDR
in UDP.(Contributed by Hugo van Kemenade inbpo-45129.)Removed the
binhex
module, deprecated in Python 3.9.Also removed the related, similarly-deprecatedbinascii
functions:binascii.a2b_hqx()
binascii.b2a_hqx()
binascii.rlecode_hqx()
binascii.rldecode_hqx()
The
binascii.crc_hqx()
function remains available.(Contributed by Victor Stinner inbpo-45085.)
Removed the
distutils
bdist_msi
command deprecated in Python 3.9.Usebdist_wheel
(wheel packages) instead.(Contributed by Hugo van Kemenade inbpo-45124.)Removed the
__getitem__()
methods ofxml.dom.pulldom.DOMEventStream
,wsgiref.util.FileWrapper
andfileinput.FileInput
, deprecated since Python 3.9.(Contributed by Hugo van Kemenade inbpo-45132.)Removed the deprecated
gettext
functionslgettext()
,ldgettext()
,lngettext()
andldngettext()
.Also removed thebind_textdomain_codeset()
function,theNullTranslations.output_charset()
andNullTranslations.set_output_charset()
methods,and thecodeset parameter oftranslation()
andinstall()
,since they are only used for thel*gettext()
functions.(Contributed by Donghee Na and Serhiy Storchaka inbpo-44235.)Removed from the
inspect
module:The
getargspec()
function, deprecated since Python 3.0;useinspect.signature()
orinspect.getfullargspec()
instead.The
formatargspec()
function, deprecated since Python 3.5;use theinspect.signature()
functionor theinspect.Signature
object directly.The undocumented
Signature.from_builtin()
andSignature.from_function()
methods, deprecated since Python 3.5;use theSignature.from_callable()
method instead.
(Contributed by Hugo van Kemenade inbpo-45320.)
Removed the
__class_getitem__()
methodfrompathlib.PurePath
,because it was not used and added by mistake in previous versions.(Contributed by Nikita Sobolev inbpo-46483.)Removed the
MailmanProxy
class in thesmtpd
module,as it is unusable without the externalmailman
package.(Contributed by Donghee Na inbpo-35800.)Removed the deprecated
split()
method of_tkinter.TkappType
.(Contributed by Erlend E. Aasland inbpo-38371.)Removed namespace package support from
unittest
discovery.It was introduced in Python 3.4 but has been broken since Python 3.7.(Contributed by Inada Naoki inbpo-23882.)Removed the undocumented private
float.__set_format__()
method,previously known asfloat.__setformat__()
in Python 3.7.Its docstring said: “You probably don’t want to use this function.It exists mainly to be used in Python’s test suite.”(Contributed by Victor Stinner inbpo-46852.)The
--experimental-isolated-subinterpreters
configure flag(and correspondingEXPERIMENTAL_ISOLATED_SUBINTERPRETERS
macro)have been removed.Pynche— The Pythonically Natural Color and Hue Editor — has been moved outof
Tools/scripts
and isbeing developed independently from the Python source tree.
Porting to Python 3.11¶
This section lists previously described changes and other bugfixesin the Python API that may require changes to your Python code.
Porting notes for the C API arelisted separately.
open()
,io.open()
,codecs.open()
andfileinput.FileInput
no longer accept'U'
(“universal newline”)in the file mode. In Python 3, “universal newline” mode is used by defaultwhenever a file is opened in text mode,and the'U'
flag has been deprecated since Python 3.3.Thenewline parameterto these functions controls how universal newlines work.(Contributed by Victor Stinner inbpo-37330.)ast.AST
node positions are now validated when provided tocompile()
and other related functions. If invalid positions are detected,aValueError
will be raised. (Contributed by Pablo Galindo ingh-93351)Prohibited passing non-
concurrent.futures.ThreadPoolExecutor
executors toasyncio.loop.set_default_executor()
following a deprecation in Python 3.8.(Contributed by Illia Volochii inbpo-43234.)calendar
: Thecalendar.LocaleTextCalendar
andcalendar.LocaleHTMLCalendar
classes now uselocale.getlocale()
, instead of usinglocale.getdefaultlocale()
,if no locale is specified.(Contributed by Victor Stinner inbpo-46659.)The
pdb
module now reads the.pdbrc
configuration file withthe'UTF-8'
encoding.(Contributed by Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) inbpo-41137.)Thepopulation parameter of
random.sample()
must be a sequence,and automatic conversion ofset
s tolist
sis no longer supported. Also, if the sample sizeis larger than the population size, aValueError
is raised.(Contributed by Raymond Hettinger inbpo-40465.)Therandom optional parameter of
random.shuffle()
was removed.It was previously an arbitrary random function to use for the shuffle;now,random.random()
(its previous default) will always be used.In
re
Regular Expression Syntax, global inline flags (e.g.(?i)
)can now only be used at the start of regular expressions.Using them elsewhere has been deprecated since Python 3.6.(Contributed by Serhiy Storchaka inbpo-47066.)In the
re
module, several long-standing bugs where fixed that,in rare cases, could cause capture groups to get the wrong result.Therefore, this could change the captured output in these cases.(Contributed by Ma Lin inbpo-35859.)
Build Changes¶
CPython now hasPEP 11Tier 3 support forcross compiling to theWebAssembly platformsEmscripten(
wasm32-unknown-emscripten
, i.e. Python in the browser)andWebAssembly System Interface (WASI)(wasm32-unknown-wasi
).The effort is inspired by previous work likePyodide.These platforms provide a limited subset of POSIX APIs; Python standardlibraries features and modules related to networking, processes, threading,signals, mmap, and users/groups are not available or don’t work.(Emscripten contributed by Christian Heimes and Ethan Smith ingh-84461and WASI contributed by Christian Heimes ingh-90473;platforms promoted ingh-95085)Building CPython now requires:
The
Py_NO_NAN
macro has been removed.Since CPython now requires IEEE 754 floats, NaN values are always available.(Contributed by Victor Stinner inbpo-46656.)The
tkinter
package now requiresTcl/Tkversion 8.5.12 or newer.(Contributed by Serhiy Storchaka inbpo-46996.)Build dependencies, compiler flags, and linker flags for most stdlibextension modules are now detected byconfigure. libffi, libnsl,libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk, and uuid flagsare detected bypkg-config (when available).
tkinter
now requires a pkg-config commandto detect development settings forTcl/Tk headers and libraries.(Contributed by Christian Heimes and Erlend Egeberg Aasland inbpo-45847,bpo-45747, andbpo-45763.)libpython is no longer linked against libcrypt.(Contributed by Mike Gilbert inbpo-45433.)
CPython can now be built with theThinLTO optionvia passing
thin
to--with-lto
, i.e.--with-lto=thin
.(Contributed by Donghee Na and Brett Holman inbpo-44340.)Freelists for object structs can now be disabled. A newconfigureoption
--without-freelists
can be used to disable all freelistsexcept empty tuple singleton.(Contributed by Christian Heimes inbpo-45522.)Modules/Setup
andModules/makesetup
have been improved and tied up.Extension modules can now be built throughmakesetup
. All except sometest modules can be linked statically into a main binary or library.(Contributed by Brett Cannon and Christian Heimes inbpo-45548,bpo-45570,bpo-45571, andbpo-43974.)Note
Use the environment variables
TCLTK_CFLAGS
andTCLTK_LIBS
to manually specify the location of Tcl/Tk headersand libraries. Theconfigure options--with-tcltk-includes
and--with-tcltk-libs
have been removed.On RHEL 7 and CentOS 7 the development packages do not provide
tcl.pc
andtk.pc
; useTCLTK_LIBS="-ltk8.5-ltkstub8.5-ltcl8.5"
.The directoryMisc/rhel7
contains.pc
files and instructionson how to build Python with RHEL 7’s and CentOS 7’s Tcl/Tk and OpenSSL.CPython will now use 30-bit digits by default for the Python
int
implementation. Previously, the default was to use 30-bit digits on platformswithSIZEOF_VOID_P>=8
, and 15-bit digits otherwise. It’s still possibleto explicitly request use of 15-bit digits via either the--enable-big-digits
option to the configure scriptor (for Windows) thePYLONG_BITS_IN_DIGIT
variable inPC/pyconfig.h
,but this option may be removed at some point in the future.(Contributed by Mark Dickinson inbpo-45569.)
C API Changes¶
New Features¶
Add a new
PyType_GetName()
function to get type’s short name.(Contributed by Hai Shi inbpo-42035.)Add a new
PyType_GetQualName()
function to get type’s qualified name.(Contributed by Hai Shi inbpo-42035.)Add new
PyThreadState_EnterTracing()
andPyThreadState_LeaveTracing()
functions to the limited C API tosuspend and resume tracing and profiling.(Contributed by Victor Stinner inbpo-43760.)Added the
Py_Version
constant which bears the same value asPY_VERSION_HEX
.(Contributed by Gabriele N. Tornetta inbpo-43931.)Py_buffer
and APIs are now part of the limited API and the stableABI:bf_getbuffer
andbf_releasebuffer
type slots
(Contributed by Christian Heimes inbpo-45459.)
Added the
PyType_GetModuleByDef()
function, used to get the modulein which a method was defined, in cases where this information is notavailable directly (viaPyCMethod
).(Contributed by Petr Viktorin inbpo-46613.)Add new functions to pack and unpack C double (serialize and deserialize):
PyFloat_Pack2()
,PyFloat_Pack4()
,PyFloat_Pack8()
,PyFloat_Unpack2()
,PyFloat_Unpack4()
andPyFloat_Unpack8()
.(Contributed by Victor Stinner inbpo-46906.)Add new functions to get frame object attributes:
PyFrame_GetBuiltins()
,PyFrame_GetGenerator()
,PyFrame_GetGlobals()
,PyFrame_GetLasti()
.Added two new functions to get and set the active exception instance:
PyErr_GetHandledException()
andPyErr_SetHandledException()
.These are alternatives toPyErr_SetExcInfo()
andPyErr_GetExcInfo()
which work with the legacy 3-tuplerepresentation of exceptions.(Contributed by Irit Katriel inbpo-46343.)Added the
PyConfig.safe_path
member.(Contributed by Victor Stinner ingh-57684.)
Porting to Python 3.11¶
Some macros have been converted to static inline functions to avoidmacro pitfalls.The change should be mostly transparent to users,as the replacement functions will cast their arguments to the expected typesto avoid compiler warnings due to static type checks.However, when the limited C API is set to >=3.11,these casts are not done,and callers will need to cast arguments to their expected types.SeePEP 670 for more details.(Contributed by Victor Stinner and Erlend E. Aasland ingh-89653.)
PyErr_SetExcInfo()
no longer uses thetype
andtraceback
arguments, the interpreter now derives those values from the exceptioninstance (thevalue
argument). The function still steals referencesof all three arguments.(Contributed by Irit Katriel inbpo-45711.)PyErr_GetExcInfo()
now derives thetype
andtraceback
fields of the result from the exception instance (thevalue
field).(Contributed by Irit Katriel inbpo-45711.)_frozen
has a newis_package
field to indicate whetheror not the frozen module is a package. Previously, a negative valuein thesize
field was the indicator. Now only non-negative valuesbe used forsize
.(Contributed by Kumar Aditya inbpo-46608.)_PyFrameEvalFunction()
now takes_PyInterpreterFrame*
as its second parameter, instead ofPyFrameObject*
.SeePEP 523 for more details of how to use this function pointer type.PyCode_New()
andPyCode_NewWithPosOnlyArgs()
now takean additionalexception_table
argument.Using these functions should be avoided, if at all possible.To get a custom code object: create a code object using the compiler,then get a modified version with thereplace
method.PyCodeObject
no longer has theco_code
,co_varnames
,co_cellvars
andco_freevars
fields. Instead, usePyCode_GetCode()
,PyCode_GetVarnames()
,PyCode_GetCellvars()
andPyCode_GetFreevars()
respectivelyto access them via the C API.(Contributed by Brandt Bucher inbpo-46841 and Ken Jin ingh-92154andgh-94936.)The old trashcan macros (
Py_TRASHCAN_SAFE_BEGIN
/Py_TRASHCAN_SAFE_END
)are now deprecated. They should be replaced by the new macrosPy_TRASHCAN_BEGIN
andPy_TRASHCAN_END
.A tp_dealloc function that has the old macros, such as:
staticvoidmytype_dealloc(mytype*p){PyObject_GC_UnTrack(p);Py_TRASHCAN_SAFE_BEGIN(p);...Py_TRASHCAN_SAFE_END}
should migrate to the new macros as follows:
staticvoidmytype_dealloc(mytype*p){PyObject_GC_UnTrack(p);Py_TRASHCAN_BEGIN(p,mytype_dealloc)...Py_TRASHCAN_END}
Note that
Py_TRASHCAN_BEGIN
has a second argument whichshould be the deallocation function it is in.To support older Python versions in the same codebase, youcan define the following macros and use them throughoutthe code (credit: these were copied from the
mypy
codebase):#if PY_VERSION_HEX >= 0x03080000# define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc)# define CPy_TRASHCAN_END(op) Py_TRASHCAN_END#else# define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op)# define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op)#endif
The
PyType_Ready()
function now raises an error if a type is definedwith thePy_TPFLAGS_HAVE_GC
flag set but has no traverse function(PyTypeObject.tp_traverse
).(Contributed by Victor Stinner inbpo-44263.)Heap types with the
Py_TPFLAGS_IMMUTABLETYPE
flag can now inheritthePEP 590 vectorcall protocol. Previously, this was only possible forstatic types.(Contributed by Erlend E. Aasland inbpo-43908)Since
Py_TYPE()
is changed to a inline static function,Py_TYPE(obj)=new_type
must be replaced withPy_SET_TYPE(obj,new_type)
: see thePy_SET_TYPE()
function(available since Python 3.9). For backward compatibility, this macro can beused:#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE)staticinlinevoid_Py_SET_TYPE(PyObject*ob,PyTypeObject*type){ob->ob_type=type;}#define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)#endif
(Contributed by Victor Stinner inbpo-39573.)
Since
Py_SIZE()
is changed to a inline static function,Py_SIZE(obj)=new_size
must be replaced withPy_SET_SIZE(obj,new_size)
: see thePy_SET_SIZE()
function(available since Python 3.9). For backward compatibility, this macro can beused:#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE)staticinlinevoid_Py_SET_SIZE(PyVarObject*ob,Py_ssize_tsize){ob->ob_size=size;}#define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)#endif
(Contributed by Victor Stinner inbpo-39573.)
<Python.h>
no longer includes the header files<stdlib.h>
,<stdio.h>
,<errno.h>
and<string.h>
when thePy_LIMITED_API
macro is set to0x030b0000
(Python 3.11) or higher. C extensions shouldexplicitly include the header files after#include<Python.h>
.(Contributed by Victor Stinner inbpo-45434.)The non-limited API files
cellobject.h
,classobject.h
,code.h
,context.h
,funcobject.h
,genobject.h
andlongintrepr.h
have been moved totheInclude/cpython
directory. Moreover, theeval.h
header file wasremoved. These files must not be included directly, as they are alreadyincluded inPython.h
:Include Files. If they havebeen included directly, consider includingPython.h
instead.(Contributed by Victor Stinner inbpo-35134.)The
PyUnicode_CHECK_INTERNED()
macro has been excluded from thelimited C API. It was never usable there, because it used internal structureswhich are not available in the limited C API.(Contributed by Victor Stinner inbpo-46007.)The following frame functions and type are now directly available with
#include<Python.h>
, it’s no longer needed to add#include<frameobject.h>
:(Contributed by Victor Stinner ingh-93937.)
The
PyFrameObject
structure members have been removed from thepublic C API.While the documentation notes that the
PyFrameObject
fields aresubject to change at any time, they have been stable for a long time and wereused in several popular extensions.In Python 3.11, the frame struct was reorganized to allow performanceoptimizations. Some fields were removed entirely, as they were details of theold implementation.
PyFrameObject
fields:f_back
: usePyFrame_GetBack()
.f_blockstack
: removed.f_builtins
: usePyFrame_GetBuiltins()
.f_code
: usePyFrame_GetCode()
.f_gen
: usePyFrame_GetGenerator()
.f_globals
: usePyFrame_GetGlobals()
.f_iblock
: removed.f_lasti
: usePyFrame_GetLasti()
.Code usingf_lasti
withPyCode_Addr2Line()
should usePyFrame_GetLineNumber()
instead; it may be faster.f_lineno
: usePyFrame_GetLineNumber()
f_locals
: usePyFrame_GetLocals()
.f_stackdepth
: removed.f_state
: no public API (renamed tof_frame.f_state
).f_trace
: no public API.f_trace_lines
: usePyObject_GetAttrString((PyObject*)frame,"f_trace_lines")
.f_trace_opcodes
: usePyObject_GetAttrString((PyObject*)frame,"f_trace_opcodes")
.f_localsplus
: no public API (renamed tof_frame.localsplus
).f_valuestack
: removed.
The Python frame object is now created lazily. A side effect is that the
f_back
member must not be accessed directly,since its value is now alsocomputed lazily. ThePyFrame_GetBack()
function must be calledinstead.Debuggers that accessed the
f_locals
directlymust callPyFrame_GetLocals()
instead. They no longer need to callPyFrame_FastToLocalsWithError()
orPyFrame_LocalsToFast()
,in fact they should not call those functions. The necessary updating of theframe is now managed by the virtual machine.Code defining
PyFrame_GetCode()
on Python 3.8 and older:#if PY_VERSION_HEX < 0x030900B1staticinlinePyCodeObject*PyFrame_GetCode(PyFrameObject*frame){Py_INCREF(frame->f_code);returnframe->f_code;}#endif
Code defining
PyFrame_GetBack()
on Python 3.8 and older:#if PY_VERSION_HEX < 0x030900B1staticinlinePyFrameObject*PyFrame_GetBack(PyFrameObject*frame){Py_XINCREF(frame->f_back);returnframe->f_back;}#endif
Or use thepythoncapi_compat project to get these twofunctions on older Python versions.
Changes of the
PyThreadState
structure members:frame
: removed, usePyThreadState_GetFrame()
(function addedto Python 3.9 bybpo-40429).Warning: the function returns astrong reference, need to callPy_XDECREF()
.tracing
: changed, usePyThreadState_EnterTracing()
andPyThreadState_LeaveTracing()
(functions added to Python 3.11 bybpo-43760).recursion_depth
: removed,use(tstate->recursion_limit-tstate->recursion_remaining)
instead.stackcheck_counter
: removed.
Code defining
PyThreadState_GetFrame()
on Python 3.8 and older:#if PY_VERSION_HEX < 0x030900B1staticinlinePyFrameObject*PyThreadState_GetFrame(PyThreadState*tstate){Py_XINCREF(tstate->frame);returntstate->frame;}#endif
Code defining
PyThreadState_EnterTracing()
andPyThreadState_LeaveTracing()
on Python 3.10 and older:#if PY_VERSION_HEX < 0x030B00A2staticinlinevoidPyThreadState_EnterTracing(PyThreadState*tstate){tstate->tracing++;#if PY_VERSION_HEX >= 0x030A00A1tstate->cframe->use_tracing=0;#elsetstate->use_tracing=0;#endif}staticinlinevoidPyThreadState_LeaveTracing(PyThreadState*tstate){intuse_tracing=(tstate->c_tracefunc!=NULL||tstate->c_profilefunc!=NULL);tstate->tracing--;#if PY_VERSION_HEX >= 0x030A00A1tstate->cframe->use_tracing=use_tracing;#elsetstate->use_tracing=use_tracing;#endif}#endif
Or usethe pythoncapi-compat project to get these functionson old Python functions.
Distributors are encouraged to build Python with the optimized Blake2librarylibb2.
The
PyConfig.module_search_paths_set
field must now be set to 1 forinitialization to usePyConfig.module_search_paths
to initializesys.path
. Otherwise, initialization will recalculate the path and replaceany values added tomodule_search_paths
.PyConfig_Read()
no longer calculates the initial search path, and will notfill any values intoPyConfig.module_search_paths
. To calculate defaultpaths and then modify them, finish initialization and usePySys_GetObject()
to retrievesys.path
as a Python list object and modify it directly.
Deprecated¶
Deprecate the following functions to configure the Python initialization:
PySys_AddWarnOptionUnicode()
PySys_AddWarnOption()
PySys_AddXOption()
PySys_HasWarnOptions()
PySys_SetArgvEx()
PySys_SetArgv()
PySys_SetPath()
Py_SetPath()
Py_SetProgramName()
Py_SetPythonHome()
Py_SetStandardStreamEncoding()
_Py_SetProgramFullPath()
Use the new
PyConfig
API of thePython Initialization Configuration instead (PEP 587).(Contributed by Victor Stinner ingh-88279.)Deprecate the
ob_shash
member of thePyBytesObject
. UsePyObject_Hash()
instead.(Contributed by Inada Naoki inbpo-46864.)
Pending Removal in Python 3.12¶
The following C APIs have been deprecated in earlier Python releases,and will be removed in Python 3.12.
PyUnicode_AS_DATA()
PyUnicode_AS_UNICODE()
PyUnicode_AsUnicodeAndSize()
PyUnicode_AsUnicode()
PyUnicode_FromUnicode()
PyUnicode_GET_DATA_SIZE()
PyUnicode_GET_SIZE()
PyUnicode_GetSize()
PyUnicode_IS_COMPACT()
PyUnicode_IS_READY()
PyUnicode_WSTR_LENGTH()
_PyUnicode_AsUnicode()
PyUnicode_WCHAR_KIND
PyUnicode_InternImmortal()
Removed¶
PyFrame_BlockSetup()
andPyFrame_BlockPop()
have beenremoved.(Contributed by Mark Shannon inbpo-40222.)Remove the following math macros using the
errno
variable:Py_ADJUST_ERANGE1()
Py_ADJUST_ERANGE2()
Py_OVERFLOWED()
Py_SET_ERANGE_IF_OVERFLOW()
Py_SET_ERRNO_ON_MATH_ERROR()
(Contributed by Victor Stinner inbpo-45412.)
Remove
Py_UNICODE_COPY()
andPy_UNICODE_FILL()
macros, deprecatedsince Python 3.3. UsePyUnicode_CopyCharacters()
ormemcpy()
(wchar_t*
string), andPyUnicode_Fill()
functions instead.(Contributed by Victor Stinner inbpo-41123.)Remove the
pystrhex.h
header file. It only contains private functions.C extensions should only include the main<Python.h>
header file.(Contributed by Victor Stinner inbpo-45434.)Remove the
Py_FORCE_DOUBLE()
macro. It was used by thePy_IS_INFINITY()
macro.(Contributed by Victor Stinner inbpo-45440.)The following items are no longer available when
Py_LIMITED_API
is defined:the
Py_MARSHAL_VERSION
macro
These are not part of thelimited API.
(Contributed by Victor Stinner inbpo-45474.)
Exclude
PyWeakref_GET_OBJECT()
from the limited C API. It neverworked since thePyWeakReference
structure is opaque in thelimited C API.(Contributed by Victor Stinner inbpo-35134.)Remove the
PyHeapType_GET_MEMBERS()
macro. It was exposed in thepublic C API by mistake, it must only be used by Python internally.Use thePyTypeObject.tp_members
member instead.(Contributed by Victor Stinner inbpo-40170.)Remove the
HAVE_PY_SET_53BIT_PRECISION
macro (moved to the internal CAPI).(Contributed by Victor Stinner inbpo-45412.)
Remove the
Py_UNICODE
encoder APIs,as they have been deprecated since Python 3.3,are little usedand are inefficient relative to the recommended alternatives.The removed functions are:
PyUnicode_Encode()
PyUnicode_EncodeASCII()
PyUnicode_EncodeLatin1()
PyUnicode_EncodeUTF7()
PyUnicode_EncodeUTF8()
PyUnicode_EncodeUTF16()
PyUnicode_EncodeUTF32()
PyUnicode_EncodeUnicodeEscape()
PyUnicode_EncodeRawUnicodeEscape()
PyUnicode_EncodeCharmap()
PyUnicode_TranslateCharmap()
PyUnicode_EncodeDecimal()
PyUnicode_TransformDecimalToASCII()
SeePEP 624 for details andmigration guidance.(Contributed by Inada Naoki inbpo-44029.)
Notable changes in 3.11.4¶
tarfile¶
The extraction methods in
tarfile
, andshutil.unpack_archive()
,have a new afilter argument that allows limiting tar features than may besurprising or dangerous, such as creating files outside the destinationdirectory.SeeExtraction filters for details.In Python 3.12, use without thefilter argument will show aDeprecationWarning
.In Python 3.14, the default will switch to'data'
.(Contributed by Petr Viktorin inPEP 706.)
Notable changes in 3.11.5¶
OpenSSL¶
Windows builds and macOS installers from python.org now use OpenSSL 3.0.