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
-Pcommand line option andPYTHONSAFEPATHenvironmentvariable 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 andBaseExceptionGroupmake 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.11will 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 aTypedDictwith 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 asclassmethods,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__importannotationsfuture 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
forstatements.(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
TypeErroris now raised instead of anAttributeErrorinwithstatements andcontextlib.ExitStack.enter_context()for objects that do not support thecontext manager protocol,and inasyncwithstatements 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.copyingandpickleing instances of subclasses of builtin typesbytearray,set,frozenset,collections.OrderedDict,collections.deque,weakref.WeakSet, anddatetime.tzinfonow 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
-Pcommand line optionand aPYTHONSAFEPATHenvironment variable,which disable the automatic prepending tosys.pathof the script’s directory when running a script,or the current directory when using-cand-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-bandsys.path_importer_cachewhenthere is a mixture ofstrandbyteskeys.(Contributed by Thomas Grainger ingh-91181.)
Other CPython Implementation Changes¶
The special methods
__complex__()forcomplexand__bytes__()forbytesare implemented to supportthetyping.SupportsComplexandtyping.SupportsBytesprotocols.(Contributed by Mark Dickinson and Donghee Na inbpo-24234.)siphash13is 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 usesiphash13too.(Contributed by Inada Naoki inbpo-29410.)When an active exception is re-raised by a
raisestatement 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 currentexceptclause arereflected in the re-raised exception.(Contributed by Irit Katriel inbpo-45711.)The interpreter state’s representation of handled exceptions(aka
exc_infoor_PyErr_StackItem)now only has theexc_valuefield;exc_typeandexc_tracebackhave 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_setfield must now be set to1forinitialization to usePyConfig.module_search_pathsto initializesys.path. Otherwise, initialization will recalculate the path and replaceany values added tomodule_search_paths.The output of the
--helpoption now fits in 50 lines/80 columns.Information aboutPython environment variablesand-Xoptions is now available using the respective--help-envand--help-xoptionsflags,and with the new--help-all.(Contributed by Éric Araujo inbpo-46142.)Converting between
intandstrin bases other than 2(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)now raises aValueErrorif 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, orsysAPIs. See theinteger string conversionlength limitation documentation. The default limitis 4300 digits in string form.
New Modules¶
Improved Modules¶
asyncio¶
Added the
TaskGroupclass,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
Runnerclass, which exposes the machineryused byrun().(Contributed by Andrew Svetlov ingh-91218.)Added the
Barrierclass to the synchronizationprimitives in the asyncio library, and the relatedBrokenBarrierErrorexception.(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 inSelectorEventLoopandProactorEventLoop.(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
EnumMetatoEnumType(EnumMetakept 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 fromReprEnumit 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
Flagenumsand theFlagBoundaryenum with its options,to control how to handle out-of-range flag values.Added the
verify()enum decoratorand theEnumCheckenum 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 theASCIImemberofre.RegexFlagrather than'RegexFlag.ASCII'.Enhanced
Flagto supportlen(), iteration andin/notinon its members.For example, the following now works:len(AFlag(3))==2andlist(AFlag(3))==(AFlag.ONE,AFlag.TWO)Changed
EnumandFlagso that members are now definedbefore__init_subclass__()is called;dir()now includes methods, etc., from mixed-in data types.Changed
Flagto 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_DUP2FDandF_DUP2FD_CLOEXECflags respectivelyare supported, the former equals todup2usage while the latter settheFD_CLOEXECflag in addition.
fractions¶
functools¶
functools.singledispatch()now supportstypes.UnionTypeandtyping.Unionas 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 thegzipmodule. 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
_sha3module with SHA3 and SHAKE algorithms now usestiny_sha3 instead of theKeccak Code Package to reduce code and binarysize. Thehashlibmodule 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
inspectmodule to return newFrameInfoandTracebackclass 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.nanvalue is now always available.(Contributed by Victor Stinner inbpo-46917.)
operator¶
A new function
operator.callhas 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.)As of 3.11.10,
os.mkdir()andos.makedirs()on Windowsnow support passing amode value of0o700to apply accesscontrol to the new directory. This implicitly affectstempfile.mkdtemp()and is a mitigation for CVE-2024-4030.Other values formode continue to be ignored.(Contributed by Steve Dower ingh-118486.)
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, anExceptionGroupcontaining all errorsinstead of only raising the last error.(Contributed by Irit Katriel inbpo-29980.)
sqlite3¶
You can now disable the authorizer by passing
Nonetoset_authorizer().(Contributed by Erlend E. Aasland inbpo-44491.)Collation name
create_collation()can nowcontain any Unicode character. Collation names with invalid charactersnow raiseUnicodeEncodeErrorinstead ofsqlite3.ProgrammingError.(Contributed by Erlend E. Aasland inbpo-44688.)sqlite3exceptions now include the SQLite extended error code assqlite_errorcodeand the SQLite error name assqlite_errorname.(Contributed by Aviv Palivoda, Daniel Shahaf, and Erlend E. Aasland inbpo-16379 andbpo-24139.)Add
setlimit()andgetlimit()tosqlite3.Connectionforsetting and getting SQLite limits by connection basis.(Contributed by Erlend E. Aasland inbpo-45243.)sqlite3now setssqlite3.threadsafetybased on the defaultthreading mode the underlying SQLite library has been compiled with.(Contributed by Erlend E. Aasland inbpo-45613.)sqlite3C callbacks now use unraisable exceptions if callbacktracebacks are enabled. Users can now register anunraisablehookhandlerto 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.Connectionforserializing and deserializing databases.(Contributed by Erlend E. Aasland inbpo-41930.)Add
create_window_function()tosqlite3.Connectionfor creating aggregate window functions.(Contributed by Erlend E. Aasland inbpo-34916.)Add
blobopen()tosqlite3.Connection.sqlite3.Bloballows 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 thetypeandtracebackfieldsfrom 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_pathflag.(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¶
SpooledTemporaryFileobjects now fully implement the methodsofio.BufferedIOBaseorio.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.)As of 3.11.10 on Windows, the default mode
0o700used bytempfile.mkdtemp()now limits access to the new directory due tochanges toos.mkdir(). This is a mitigation for CVE-2024-4030.(Contributed by Steve Dower ingh-118486.)
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 theformattedTracebackExceptioninstance 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.TypedDicttypes can now be generic. (Contributed bySamodya Abeysiriwardane ingh-89026.)NamedTupletypes 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 ofProtocolsubclassesis 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_checkfunction. (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 addsOptionalto parameters withNoneas a default. (Contributed by Nikita Sobolevingh-90353.)typing.get_type_hints()now supports evaluating bare stringifiedClassVarannotations. (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()ofclassIsolatedAsyncioTestCaseand 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,suffixandsuffixestozipfile.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,%rand%aand 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 anintby 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
dictsize.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.DatagramProtocolis 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.)mathfunctionscomb()andperm()are now≈10 times faster for large arguments (with a larger speedup for largerk).(Contributed by Serhiy Storchaka inbpo-37295.)The
statisticsfunctionsmean(),variance()andstdev()now consumeiterators in one pass rather than converting them to alistfirst.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
trystatements 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_GENERATORandSEND,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_MATCHandPREP_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_FUNCTIONCALL_FUNCTION_KWCALL_METHOD | Decouples argument shifting for methodsfrom handling of keyword arguments;allows better specialization of calls | |
DUP_TOPDUP_TOP_TWOROT_TWOROT_THREEROT_FOURROT_N | Stack manipulation instructions | |
JUMP_IF_NOT_EXC_MATCH | Now performs check but doesn’t jump | |
JUMP_ABSOLUTEPOP_JUMP_IF_FALSEPOP_JUMP_IF_TRUE | See[3]; | |
SETUP_WITHSETUP_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_CLASSandMATCH_KEYSto no longer push an additional boolean value to indicate success/failure.Instead,Noneis 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_FINALLYandYIELD_FROM.
Deprecated¶
This section lists Python APIs that have been deprecated in Python 3.11.
Deprecated C APIs arelisted separately.
Language/Builtins¶
Chaining
classmethoddescriptors (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 aSyntaxWarningandeventually 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:
(Contributed by Brett Cannon inbpo-47061 and Victor Stinner ingh-68966.)
The
asynchat,asyncoreandsmtpdmodules 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
lib2to3package 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_constantsandsre_parseare now deprecated.(Contributed by Serhiy Storchaka inbpo-47152.)
Standard Library¶
The following have been deprecated in
configparsersince Python 3.2.Their deprecation warnings have now been updated to note they will be removedin Python 3.12:the
configparser.SafeConfigParserclassthe
configparser.ParsingError.filenamepropertythe
configparser.RawConfigParser.readfp()method
(Contributed by Hugo van Kemenade inbpo-45173.)
configparser.LegacyInterpolationhas been deprecated in the docstringsince Python 3.2, and is not listed in theconfigparserdocumentation.It now emits aDeprecationWarningand will be removedin Python 3.13. Useconfigparser.BasicInterpolationorconfigparser.ExtendedInterpolationinstead.(Contributed by Hugo van Kemenade inbpo-46607.)The older set of
importlib.resourcesfunctions 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: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
bytespatterns 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
remodule, there.template()functionand the correspondingre.TEMPLATEandre.Tflagsare 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 usestrinsteadwherever possible.(Contributed by Alex Waygood ingh-92332.)The keyword argument syntax for constructing
typing.TypedDicttypesis now deprecated. Support will be removed in Python 3.13. (Contributed byJingchen Ye ingh-90224.)webbrowser.MacOSXis deprecated and will be removed in Python 3.13.It is untested, undocumented, and not used bywebbrowseritself.(Contributed by Donghee Na inbpo-42255.)The behavior of returning a value from a
TestCaseandIsolatedAsyncioTestCasetest methods (other than thedefaultNonevalue) is now deprecated.Deprecated the following not-formally-documented
unittestfunctions,scheduled for removal in Python 3.13:unittest.findTestCases()unittest.makeSuite()unittest.getTestCaseNames()
Use
TestLoadermethods 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
asynchatmoduleThe
asyncoremoduleThe
impmoduleThe
typing.ionamespaceThe
typing.renamespacecgi.log()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.WindowsRegistryFinder.find_module()importlib.util.set_loader_wrapper()importlib.util.set_package_wrapper()sqlite3.enable_shared_cache()sqlite3.OptimizedUnicode()PYTHONTHREADDEBUGenvironment variableThe following deprecated aliases in
unittest:Deprecated alias
Method Name
Deprecated in
failUnless3.1
failIf3.1
failUnlessEqual3.1
failIfEqual3.1
failUnlessAlmostEqual3.1
failIfAlmostEqual3.1
failUnlessRaises3.1
assert_3.2
assertEquals3.2
assertNotEquals3.2
assertAlmostEquals3.2
assertNotAlmostEquals3.2
assertRegexpMatches3.2
assertRaisesRegexp3.2
assertNotRegexpMatches3.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/awaitcode.The function has been deprecated since Python 3.8 and the removal wasinitially scheduled for Python 3.10. Useasyncdefinstead.(Contributed by Illia Volochii inbpo-43216.)Removed
asyncio.coroutines.CoroWrapperused 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_REUSEADDRin UDP.(Contributed by Hugo van Kemenade inbpo-45129.)Removed the
binhexmodule, deprecated in Python 3.9.Also removed the related, similarly-deprecatedbinasciifunctions: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
distutilsbdist_msicommand 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.FileWrapperandfileinput.FileInput, deprecated since Python 3.9.(Contributed by Hugo van Kemenade inbpo-45132.)Removed the deprecated
gettextfunctionslgettext(),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
inspectmodule: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.Signatureobject 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
MailmanProxyclass in thesmtpdmodule,as it is unusable without the externalmailmanpackage.(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
unittestdiscovery.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-subinterpretersconfigure flag(and correspondingEXPERIMENTAL_ISOLATED_SUBINTERPRETERSmacro)have been removed.Pynche— The Pythonically Natural Color and Hue Editor — has been moved outof
Tools/scriptsand 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.FileInputno 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.ASTnode positions are now validated when provided tocompile()and other related functions. If invalid positions are detected,aValueErrorwill be raised. (Contributed by Pablo Galindo ingh-93351)Prohibited passing non-
concurrent.futures.ThreadPoolExecutorexecutors toasyncio.loop.set_default_executor()following a deprecation in Python 3.8.(Contributed by Illia Volochii inbpo-43234.)calendar: Thecalendar.LocaleTextCalendarandcalendar.LocaleHTMLCalendarclasses now uselocale.getlocale(), instead of usinglocale.getdefaultlocale(),if no locale is specified.(Contributed by Victor Stinner inbpo-46659.)The
pdbmodule now reads the.pdbrcconfiguration file withthe'UTF-8'encoding.(Contributed by Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) inbpo-41137.)Thepopulation parameter of
random.sample()must be a sequence,and automatic conversion ofsets tolistsis no longer supported. Also, if the sample sizeis larger than the population size, aValueErroris 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
reRegular 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
remodule, 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_NANmacro has been removed.Since CPython now requires IEEE 754 floats, NaN values are always available.(Contributed by Victor Stinner inbpo-46656.)The
tkinterpackage 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).
tkinternow 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
thinto--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-freelistscan be used to disable all freelistsexcept empty tuple singleton.(Contributed by Christian Heimes inbpo-45522.)Modules/SetupandModules/makesetuphave 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_CFLAGSandTCLTK_LIBSto manually specify the location of Tcl/Tk headersand libraries. Theconfigure options--with-tcltk-includesand--with-tcltk-libshave been removed.On RHEL 7 and CentOS 7 the development packages do not provide
tcl.pcandtk.pc; useTCLTK_LIBS="-ltk8.5-ltkstub8.5-ltcl8.5".The directoryMisc/rhel7contains.pcfiles 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
intimplementation. 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-digitsoption to the configure scriptor (for Windows) thePYLONG_BITS_IN_DIGITvariable 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_Versionconstant which bears the same value asPY_VERSION_HEX.(Contributed by Gabriele N. Tornetta inbpo-43931.)Py_bufferand APIs are now part of the limited API and the stableABI:bf_getbufferandbf_releasebuffertype 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_pathmember.(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 thetypeandtracebackarguments, the interpreter now derives those values from the exceptioninstance (thevalueargument). The function still steals referencesof all three arguments.(Contributed by Irit Katriel inbpo-45711.)PyErr_GetExcInfo()now derives thetypeandtracebackfields of the result from the exception instance (thevaluefield).(Contributed by Irit Katriel inbpo-45711.)_frozenhas a newis_packagefield to indicate whetheror not the frozen module is a package. Previously, a negative valuein thesizefield 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_tableargument.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 thereplacemethod.PyCodeObjectno longer has theco_code,co_varnames,co_cellvarsandco_freevarsfields. 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_BEGINandPy_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_BEGINhas 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
mypycodebase):#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_GCflag set but has no traverse function(PyTypeObject.tp_traverse).(Contributed by Victor Stinner inbpo-44263.)Heap types with the
Py_TPFLAGS_IMMUTABLETYPEflag 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_typemust 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_sizemust 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_APImacro 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.handlongintrepr.hhave been moved totheInclude/cpythondirectory. Moreover, theeval.hheader file wasremoved. These files must not be included directly, as they are alreadyincluded inPython.h:Include Files. If they havebeen included directly, consider includingPython.hinstead.(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
PyFrameObjectstructure members have been removed from thepublic C API.While the documentation notes that the
PyFrameObjectfields 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.
PyFrameObjectfields: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_lastiwithPyCode_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_backmember must not be accessed directly,since its value is now alsocomputed lazily. ThePyFrame_GetBack()function must be calledinstead.Debuggers that accessed the
f_localsdirectlymust 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
PyThreadStatestructure 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_setfield must now be set to 1 forinitialization to usePyConfig.module_search_pathsto 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.pathas 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
PyConfigAPI of thePython Initialization Configuration instead (PEP 587).(Contributed by Victor Stinner ingh-88279.)Deprecate the
ob_shashmember 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_KINDPyUnicode_InternImmortal()
Removed¶
PyFrame_BlockSetup()andPyFrame_BlockPop()have beenremoved.(Contributed by Mark Shannon inbpo-40222.)Remove the following math macros using the
errnovariable: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.hheader 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_APIis defined:the
Py_MARSHAL_VERSIONmacro
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 thePyWeakReferencestructure 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_membersmember instead.(Contributed by Victor Stinner inbpo-40170.)Remove the
HAVE_PY_SET_53BIT_PRECISIONmacro (moved to the internal CAPI).(Contributed by Victor Stinner inbpo-45412.)
Remove the
Py_UNICODEencoder 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.
Notable changes in 3.11.10¶
ipaddress¶
Fixed
is_globalandis_privatebehavior inIPv4Address,IPv6Address,IPv4NetworkandIPv6Network.
email¶
Headers with embedded newlines are now quoted on output.
The
generatorwill now refuse to serialize (write) headersthat are improperly folded or delimited, such that they would be parsed asmultiple headers or joined with adjacent data.If you need to turn this safety feature off,setverify_generated_headers.(Contributed by Bas Bloemsaat and Petr Viktorin ingh-121650.)email.utils.getaddresses()andemail.utils.parseaddr()now return('','')2-tuples in more situations where invalid email addresses areencountered, instead of potentially inaccurate values.An optionalstrict parameter was added to these two functions:usestrict=Falseto get the old behavior, accepting malformed inputs.getattr(email.utils,'supports_strict_parsing',False)can be used tocheck if thestrict paramater is available.(Contributed by Thomas Dwyer and Victor Stinner forgh-102988 to improvethe CVE-2023-27043 fix.)
Notable changes in 3.11.13¶
os.path¶
Thestrict parameter to
os.path.realpath()accepts a new value,os.path.ALLOW_MISSING.If used, errors other thanFileNotFoundErrorwill be re-raised;the resulting path can be missing but it will be free of symlinks.(Contributed by Petr Viktorin for CVE 2025-4517.)
tarfile¶
data_filter()now normalizes symbolic link targets in order toavoid path traversal attacks.(Contributed by Petr Viktorin ingh-127987 and CVE 2025-4138.)extractall()now skips fixing up directory attributeswhen a directory was removed or replaced by another kind of file.(Contributed by Petr Viktorin ingh-127987 and CVE 2024-12718.)extract()andextractall()now (re-)apply the extraction filter when substituting a link (hard orsymbolic) with a copy of another archive member, and when fixing updirectory attributes.The former raises a new exception,LinkFallbackError.(Contributed by Petr Viktorin for CVE 2025-4330 and CVE 2024-12718.)extract()andextractall()no longer extract rejected members whenerrorlevel()is zero.(Contributed by Matt Prodani and Petr Viktorin ingh-112887and CVE 2025-4435.)